算法_插入排序之希尔排序

排序思路

希尔排序是一种分组插入方法。先取一个小于元素个数n的正整数d,将元素分成d组,依次对每组内部进行直接插入排序,完成一趟后,再取一个小于d的增量,重复以上步骤,直到增量为1时进行最后一趟排序,此时元素基本正序。

实现

void shell_sort(RecType R[], int n)
{
    int i, j, d;
    RecType tmp;
    d = n/2;
    while (n > 0)
    {
        for (i=d; i<n; i++)
        {
            tmp = R[i];
            j = i-d;
            while (j>=0 && tmp.key < R[j].key)
            {
                R[j-d] = R[j];
                j -= d;
            }
            R[j+d] = tmp;
        }
        d /= 2;
    }
}

算法分析

时间复杂度分析

平均时间复杂度:因为希尔排序的时间复杂度难以分析,而经研究一般认为是:
O ( n 1.3 ) O(n^{1.3}) O(n1.3)
希尔排序在效率上比直接插入排序有很大的改善,原因有2:

  1. 当增量较小时,直接插入排序的最好和最坏时间复杂度差别不大,而希尔排序就是从增量很小开始的。
  2. 当增量逐渐增大时,数据逐渐趋于有序,当增量为1时,希尔排序对数据序列进行一趟直接插入排序,而此时数据序列基本正序。

空间复杂度

O ( 1 ) O(1) O(1)

稳定性

不稳定

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值