排序(插入排序 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)的主要内容,如果未能解决你的问题,请参考以下文章

InsertSort 插入排序

排序--InsertSort优化

直接插入排序/二分插入排序/希尔排序

插入排序

php quickSort insertSort 快速 插入排序

InsertSort