排序(插入排序 InsertSort && 希尔排序 ShellSort)
Posted Naxx Crazy
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了排序(插入排序 InsertSort && 希尔排序 ShellSort)相关的知识,希望对你有一定的参考价值。
这里讲一下排序,排序在算法中挺重要的,因为我们很多时候都需要排序,不管是成绩排序还是其他的排序,而且不同的类型排序方法也是不同的,今天我们就讲两种排序
第一个 插入排序,插入排序是什么呢?
首先插入排序顾名思义,如果是升序的话,那么就是找一个元素然后比较,如果比他小的话,就让大的去后面,把小的元素插入到前面
我们可以先画图看一下
首先我们向一个有序数组中插入一个7
那么首先我们7和end指向的位置比较,如果他小于end指向的位置,然后让end指向的位置向后挪一下,然后把7插入进去然后再让end向后走一下
就像这样,然后我们继续比较
当他换到6和8的中间后,他又和6进行比较,他不小于7,然后就可以结束了,但是这只是拍了一个元素,如果我们要排序一整个数组呢?
首先我们可以看一下代码
这就是拍一个元素,那么如果我们想要拍一整个数组呢?
我们首先可以这样,让end先指向第一个元素,然后让tmp是end后面的元素,然后让end一直向后走,知道end到n-1-1(n为数组元素个数)
下面看一下代码
就是这样,还是比较简单的
下面我们看一下希尔排序
这个比较难一点,但是他是插入排序改的,所以我们可以看一下
首先这里讲思路,我们可以想一下,如果对于插入排序来说,如果是一个有序的数组他排序起来时间复杂度为O(n)如果这个数组接近有序,他的时间复杂度为特别小
所以我们可以看一下,希尔排序就是让这个数组里面的元素一步一步接近有序
其中我们可以让这些元素为一个组,我们就称为gas,我们让gas+3的元素为一个组
然后我们就排序这些为一个组的人
这个就是拍黑色的一组
下面就看全部拍好是怎么样子的
这就是全部拍好之后,这样就看起来比前面有序多了,对于插入排序来说越有序,时间复杂度越低
所以如果当gas为1的时候就是插入排序了
所以我们先看一下gas为3的时候,代码是什么样子
如果Gas为3就是这样子的,我们定义end为i,然后让tmp等于数组里面end+gas位置的值,然后就和插入排序一样了
但是我们的gas给多少合适呢?如果给1的话就是插入排序了,如果给太大的话虽然快但是排序之后也越不容易有序,所以我们的gas应该是动态的,所以我们就可以这样
我们可以刚开始让把n给gas然后让gas每次除 等2,这样gas最后一定会为1,所以当gas小于1的时候我们就退出,就已经排序完成了
插入排序
- (void)insertSort
{
NSMutableArray *dataArray = [NSMutableArray arrayWithObjects:@3,@4,@6,@2,@9,@7,@8, nil];
for (int i = 0; i<dataArray.count-1; i++) {
NSInteger j = i+1;
while (j>=1 && [dataArray[j-1]integerValue]<[dataArray[j]integerValue]) {
id obj = dataArray[j];
[dataArray replaceObjectAtIndex:j withObject:dataArray[j-1]];
[dataArray replaceObjectAtIndex:j-1 withObject:obj];
j--;
[AlgorithmSort printArray:dataArray];
}
}
[AlgorithmSort printArray:dataArray];
}
- (void)kInserSort:(NSMutableArray *)array{
array = [NSMutableArray arrayWithObjects:@3,@4,@6,@2,@9,@7,@8, nil];
for (int i = 0; i < array.count; i++) {
NSNumber *temp = array[i];
int j = i-1;
while (j >= 0 && [array[j] compare:temp] == NSOrderedDescending) {
[array replaceObjectAtIndex:j+1 withObject:array[j]];
j--;
}
[array replaceObjectAtIndex:j+1 withObject:temp];
NSLog(@"插入排序排序中:%@",array);
}
}
+ (void)printArray:(NSArray *)array
{
for(NSNumber *number in array) {
printf("%d ",[number intValue]);
}
printf("
");
}
以上是关于排序(插入排序 InsertSort && 希尔排序 ShellSort)的主要内容,如果未能解决你的问题,请参考以下文章