【算法基础】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 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步