多一些Aha Time,发现技术的美妙🍺|

啊原来是这样呀

园龄:8年3个月粉丝:3关注:9

【算法基础】10.十大排序算法——希尔排序

参考资料

希尔排序算法详解https://blog.csdn.net/qq_35344198/article/details/106665126

 

直观理解

先细粒度分组(注意粒度与组内步长成反比),分组之后在组内插入排序,所有组都在组内插排完成后,逐步使分组粒度加大,重新分组之后再在组内插排

 

例子先行

复制代码
 1 void MyShellSort(vector<int>& array)
 2 {
 3     int n = array.size();
 4     int inc;//希尔增量
 5 
 6     //这里采用朴素希尔增量,就是每次增量都是原来的一半,直到增量为1为止
 7     for (inc = n / 2; inc >= 1; inc = inc / 2)
 8     {
 9         //下面的内容和插入排序的原理是一样的,只不过每组中元素的间隔是inc
10         //从inc开始,[inc]之前的inc个元素可视作每组各自的array[0],不必参与插入排序
11         //i每次++,都切换了一个组
12         for (int curValId = inc; curValId < n; curValId++)
13         {
14             int temp = array[curValId];//temp存储要插入的值
15             int checkId;//插入排序时,前方被拿来比较的元素id
16 
17             //从当前待插元素的前一个元素开始比较,直到往前找到比当前元素更小的值
18             //比较完一次之后,再往前走inc个距离到达再前一个元素
19             for (checkId = curValId - inc; checkId >= 0 && array[checkId] > temp; checkId = checkId - inc)
20             {
21                 array[checkId + inc] = array[checkId]; //交换                    
22             }
23 
24             //和插入排序一样
25             //一旦跳出了循环,有以下情况
26             //1.迭代了0次,首个比较元素就比temp小,这个时候[checkId + inc]仍然等于curValId,直接将temp存回原位
27             //2.迭代了>0次、遇到了比temp小的值,靠array[checkId] > temp为否就跳出了循环,
28             // 此时checkId经过了-inc往前走了一个增量,[checkId + inc]就是刚刚被移到后面而空出来的地方
29             //3.迭代了>0次、没遇到比temp小的值,靠checkId >= 0为否就跳出了循环,此时checkId已经<0,[checkId + inc]就是
30             //本组序列最前一个元素的位置
31             array[checkId + inc] = temp;
32         }
33     }
34 }
复制代码

 

总结提炼

1 分组+插入排序,注意理解组的切换、步长的条跃造成的索引变化

 

拓展方向

 

本文作者:OhOfCourse

本文链接:https://www.cnblogs.com/OhOfCourse/p/16916418.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   啊原来是这样呀  阅读(13)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起