希尔排序

本文详细介绍了希尔排序算法,包括其基本思想、算法步骤及实现代码。希尔排序是插入排序的一种改进,通过将序列分割为多个子序列进行排序来提高效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

希尔排序

希尔排序(Shell Sort)是插入排序的一种。因 D.L.Shell 于 1959 年提出而得名。

希尔排序思路

基本思想:将整个待排序记录序列分割为若干个子序列,然后对每一个子序列进行直接插入排序.

算法思路:
1. 先取一个正整数 d1(d1 < n),把全部记录分成 d1 个组,所有距离为 d1 的倍数的记录看成一组,然后在各组内进行插入排序
2. 然后取 d2(d2 < d1)
3. 重复上述分组和排序操作;直到取 di = 1(i >= 1) 位置,即所有记录成为一个组,最后对这个组进行插入排序。一般选 d1 约为 n/2,d2 为 d1 /2, d3 为 d2/2 ,…, di = 1。

希尔排序运行过程

注:运行过程摘自一篇博客

假设有数组 array = [80, 93, 60, 12, 42, 30, 68, 85, 10],首先取 d1 = 4,将数组分为 4 组,如下图中相同颜色代表一组:

img

然后分别对 4 个小组进行插入排序,排序后的结果为:

img

然后,取 d2 = 2,将原数组分为 2 小组,如下图:

img

然后分别对 2 个小组进行插入排序,排序后的结果为:

img

最后,取 d3 = 1,进行插入排序后得到最终结果:

img

希尔排序代码

- (void)dShellSort:(NSMutableArray *)array {
    if (array.count <= 1) {
        return;
    }
    NSInteger increment = array.count / 2;
    while (increment >= 1) {
        for (NSInteger i = increment; i < array.count; i ++) {
            // 避免移动数据过程中将数据弄丢,将要排序的数据存储为临时变量
            float target = [array[i] floatValue];
            NSInteger j = i - increment ;
            if (target < [array[j] floatValue]) {
                // 目标数据需要移动,前方有序数据依次向后移动,同时通过j>0保证数组不发生越界
                while (j >= 0 && target < [array[j] floatValue]) {
                    [array exchangeObjectAtIndex:j + increment withObjectAtIndex:j];
                    j = j - increment;
                };
                // 将数据插入正确位置
                array[i - increment] = @(target);
            }
        }
        increment = increment/2;
    }
}

性能(算法时间、空间复杂度、稳定性)分析

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

  2. 空间复杂度
    空间复杂度为O(1)。

  3. 稳定性
    希尔排序是不稳定的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值