iOS 算法总结

iOS - 希尔排序

2017-12-25  本文已影响21人  SkyMing一C

Demo_github

图片源于网络

希尔排序

希尔排序(Shell Sort)又称为缩小增量排序,它是一种插入排序。它是直接插入排序算法的一种威力加强版。该方法因DL.Shell于1959年提出而得名。

算法思想

图-希尔排序示例图

在上面这幅图中:

范例代码

/**
 希尔排序

 @param array 需要排序的Array
 */
+(void)shellSort:(NSMutableArray *)array
{
    //希尔排序的思想: 先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行依次直接插入排序。
    //起始间隔值gap设置为总数的一半,
    int gap = (int)[array count] / 2;
    //当 gap==1 时 结束循环
    while (gap >= 1) {
        // 把距离为 gap 的元素编为一个组,扫描所有组
        for(int i = gap ; i < [array count]; i++){
            //取出第gap的数据
            int j = i;
            NSNumber *temp = array[i];
            // 对距离为 gap 的元素组进行排序
            while (j >= gap && [temp  integerValue] < [array[(j - gap)] integerValue]) {
                [array replaceObjectAtIndex:j withObject:array[(j - gap)]];
                j = j - gap;
                [array replaceObjectAtIndex:j withObject:temp];
            }

        }
        gap = gap / 2;
        NSLog(@"希尔排序结果:%@", array);
    }
}

算法分析

希尔排序的算法性能
希尔排序的算法性能
时间复杂度

希尔排序的时间复杂度与增量(即,步长gap)的选取有关。例如,当增量为1时,希尔排序退化成了直接插入排序,此时的时间复杂度为O(N²),而Hibbard增量的希尔排序的时间复杂度为O(N3/2)。

空间复杂度

我们在排序过程中,需要一个临时变量存储要插入的值,所以空间复杂度为 O(1) 。

算法稳定性

如图图-希尔排序示例图 中有两个相等数值的元素 5 和 5 。我们可以清楚的看到,在排序过程中,两个元素位置交换了。所以,希尔排序是不稳定的算法。

直接插入排序和希尔排序的比较

参考

排序四 希尔排序

希尔排序

上一篇 下一篇

猜你喜欢

热点阅读