【考研·数据结构->排序】9 希尔排序算法

一、希尔排序原理
1. 插入排序的问题
​ 逆序有序的数组排序时,时间复杂度为O ( n 2 ) O(n^2)O(n 
2
 ),此时效率最低

​ 顺序有序的数组排序时,时间复杂度为O ( n ) O(n)O(n),此时效率最高

​ 我们发现,当被排序的对象越接近有序时,插入排序的效率越高,那我们是否有办法将数组变成接近有序后再用插入排序,此时希尔大佬就发现了这个排序算法,并命名为希尔排序

2. 希尔排序的思路
​ 希尔排序是对插入排序的优化,基本思路是先选定一个整数作为增量,把待排序文件中的所有数据分组,以每个距离的等差数列为一组,对每一组进行排序,然后将增量缩小,继续分组排序,重复上述动作,直到增量缩小为1时,排序完正好有序。

​ 希尔排序原理是每一对分组进行排序后,整个数据就会更接近有序,当增量缩小为1时,就是插入排序,但是现在的数组非常接近有序,移动的数据很少,所以效率非常高,所以希尔排序又叫缩小增量排序。

​ 每次排序让数组接近有序的过程叫做预排序,最后一次插入是直接插入排序

二.代码

Void ShellSort(int A[],int n){
	int i,j,steplen;
    //1.步长外循环,增量变化
    for(steplen=n/2;steplen>0;steplen=steplen/2){
        for(i=steplen+1;i<=n;i++){//2.子表内循环,采用插入排序
            if(A[i-steplen]>A[i]){
                A[0]=A[i];
                for(j=i-steplen;j>0&&A[j]>A[0];j-=steplen){//实现前面比当前元素大的跳步后移
                    A[j+steplen]=A[j];
                }
                A[j+steplen]=A[0];
            }
        }
    }
    
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值