插入排序之希尔排序

算法思路:

先取一个小于 n 的整数 d_1 作为第一个增量,把文件的全部记录分组。所有距离为 d_1 的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量 d_{2}<d_{1} 重复上述的分组和排序,直至所取的增量d_{t}=1(d_{t}<d_{t-1}<\cdots <d_{2}<d_{1}),即所有记录放在同一组中进行直接插入排序为止。

该方法实质上是一种分组插入方法。

时间复杂度:

希尔排序的平均时间复杂度为O(nlogn)

 空间复杂度:

希尔排序使用了插入排序的方法,所以空间复杂度和插入排序相同,O(1)

 稳定性:

是不稳定。由于多次插入排序,我们知道一次插入排序是稳定的,不会改变相同元素的相对顺序,但在不同的插入排序过程中,相同的元素可能在各自的插入排序中移动,最后其稳定性就会被打乱,所以希尔排序是不稳定的。

代码实现:

c++代码

void shellSort(int ls[], int len) {
    
    int temp = 1;
    while (temp < len/3) {
        temp = 3*temp+1;
    }
    
    while (temp >= 1) {
        for (int i=temp; i<len; i++) {

            //对ls[i], ls[i-h], ls[i-2h], 使用插入排序法

            int e = ls[i];
            int j;
            for (j=i; j>=temp; e<ls[j-temp]; j-=temp) {

                ls[j] = ls[j-temp];

            }
            ls[j] = e;
        }
        temp /= 3;
    }
}
import math
def shellSort(ls):
   
    temp=1
    while(temp < len(ls)/3):
        temp = temp*3+1
    while temp > 0:
        for i in range(temp,len(ls)):
            gap = ls[i]
            j = i-temp
            while j >=0 and ls[j] > gap:
                ls[j+temp]=ls[j]
                j-=temp
            ls[j+temp] = gap
        temp = math.floor(temp/3)
    return ls
ls = [0,11,52,458,8]
print(shellSort(ls))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值