希尔排序


希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。但希尔排序是非稳定排序算法。

希尔排序是基于插入排序的以下两点性质而提出改进方法的:

  • 插入排序在对几乎已经排好序的数据操作时,效率高,即可以达到线性排序的效率;
  • 但插入排序一般来说是低效的,因为插入排序每次只能将数据移动一位;

希尔排序的思想是:先将整个待排序的记录序列分割称为若干子序列分别进行直接插入排序,待整个序列中的记录"基本有序"时,再对全体记录进行依次直接插入排序

很多人不明白上面说的增量是什么意思?回顾前面的插入排序,只能有相邻的元素进行比较,而希尔排序则是进行跳跃比较,而增量就是步长,比如增量为3时,下标为0的元素与下标为3的元素比较,3再与6比较,1与4比较,4再与7比较……比较完后,再去减少增量,重复之前步骤,直到增量为1,此时只有一个分组了,再对这一个分组进行插入排序,整个希尔排序就结束了。

在这里插入图片描述

  • 起始增量值设置为总数的2/3。
  • 从增量位置开始,依次与差一个增量的前一个值比较。例:第一个与表总数的 2/3的元素比,小的移动到前面。 比较完后起始位置+1继续比较。
  • 比较到最后,增量减半,并以此为起始点, 重复第二步,直到间隔数为1为止结束。

代码实现

- (void)shellSort:(NSMutableArray *)arr
{
    int gap = (int)arr.count/2;
    //当 gap==1 时 结束循环
    while (gap >=1) {
        // 把距离为 gap 的元素编为一个组,扫描所有组
        for (int i = gap; i < arr.count; i++) {
            //取出第gap的数据
            int temp = [arr[i] intValue];
            int j = i;
            // 对距离为 gap 的元素组进行排序
            while (j >= gap && temp < [arr[j - gap] intValue]) {
                [arr exchangeObjectAtIndex:j withObjectAtIndex:j-gap];
                j -= gap;
            }
        }
        gap = gap/2;
    }
}

算法分析

在这里插入图片描述

时间复杂度

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

Hibbard增量
Hibbard增量的递推公式为:H1 = 1,Hi = 2 * Hi-1 + 1……
初始增量的确定跟排序的趟数有关,我们用t代表趟数,t = log2(n+1),有小数就取整,想知道第n个增量,则公式为:
第n个增量 = 2(t-n+1) - 1 ,同样也是有小数就取整。

空间复杂度

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值