介绍
这篇文章主要讲解了“c++怎么实现希尔排序”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“c++怎么实现希尔排序”吧!
初始时,有一个大小为10的无序序列。
在第一趟排序中,我们不妨设gap1=N/2=5,即相隔距离为5的元素组成一组,可以分为5组。
接下来,按照直接插入排序的方法对每个组进行排序。
在第二趟排序中,我们把上次的差距缩小一半,即gap2=gap1/2=2(取整数)。这样每相隔距离为2的元素组成一组,可以分为2组。
按照直接插入排序的方法对每个组进行排序。
在第三趟排序中,再次把差距缩小一半,即gap3=gap2/2=1。这样相隔距离为1的元素组成一组,即只有一组。
按照直接插入排序的方法对每个组进行排序。此时,排序已经结束。
需要注意一下的是,图中有两个相等数值的元素5和5。我们可以清楚的看的到,在排序过程中,两个元素位置交换了。
所以,希尔排序是不稳定的算法。
package com.lifeibigdata.fight;/* * ,* Created by  lifei 提醒16/10/24。 ,*/public class  ShellSort { ,,,static int [], shellSort (int [], a) { ,,,,,,,int gap =, a.length /, 2; ,,,,,,,while (gap 祝辞=,1){ ,,,,,,,,,,,//,把距离为,gap 的元素编为一个组,扫描所有组//,,,,,,,,,,,,for (int 小姐:=,差距;,小姐:& lt;, a.length;,我+ +),{//,,,,,,,,,,,,,,,,int j;//,,,,,,,,,,,,,,,,int temp =,(我); ,,,,,,,,,,,,,,,,,//对距离为,gap 的元素组进行排序//,,,,,,,,,,,,,,,,,for (j =,小姐:安康;差距;,j 祝辞=,0,,,,temp & lt;, [j];, j =, j 作用;差距),{//TODO ,, j 作用;差距//,,,,,,,,,,,,,,,,,,,,,一个(时间+ j 差距),=,[j];//TODO 小姐:安康;gap +,差距//,,,,,,,,,,,,,,,,,}//,,,,,,,,,,,,,,,,,一个(时间+ j 差距),=,临时;//TODO ,, j 作用;gap +, gap =, j//,,,,,,,,,,,,,} ,,,,,,,,,,,for (int 小姐:=,差距;,小姐:& lt;, a.length;,我+ +),{ ,,,,,,,,,,,,,,,if (一个[我],& lt;,(小姐、安康、差距)){//,2,0,,3,,1,4,,2; ,,,,,,,,,,,,,,,,,,,int tmp =,(我); ,,,,,,,,,,,,,,,,,,,一个[我],=,(小姐、安康、差距); ,,,,,,,,,,,,,,,,,,,一个(小姐、安康、差距),=,tmp; ,,,,,,,,,,,,,,,} ,,,,,,,,,,,} ,,,,,,,,,,,gap =, gap /2; ,,,,,,,} ,,,,,,,return ; ,,,} ,,,public static void main (String [], args), { ,,,,,,,int [], a =, new int [] {9,,,,, 1,,,,, 2,,,,, 5,,,,, 7,,,,, 4,,,,, 8,,,,, 6,,,,, 3,,,,, 5}; ,,,,,,,int [], r =, shellSort(一个); ,,,,,,,for (int x: r), { ,,,,,,,,,,,System.out.println (x); ,,,,,,,} ,,,} }
直接插入排序和希尔排序的比较
直接插入排序是稳定的,而希尔排序是不稳定的。
直接插入排序更适合于原始记录基本有序的集合。
希尔排序的比较次数和移动次数都要比直接插入排序少,当N越大时,效果越明显。
在希尔排序中,增量序列差距的取法必须满足:最后一个步长必须是1。
直接插入排序也适用于链式存储结构;希尔排序不适用于链式结构。
感谢各位的阅读,以上就是“c++怎么实现希尔排序”的内容了,经过本文的学习后,相信大家对c++怎么实现希尔排序这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!