希尔插入排序:

来源:互联网 发布:淘宝哪家代购是正品 编辑:程序博客网 时间:2024/04/29 10:30

按一定跨度d两两进行比对并按序交换位置,进行完一轮比对后跨度缩小再进行下一轮,经过几轮后先将整个序列变成部分有序,然后再进行直接插入排序,减少直接插入排序的开销。

希尔算法涉及到2个概念,跨度和深度,跨度一般我们选取总长度n的一半,下一轮再减半,也就是[n/2,n/4,n/8,…],深度根据序列元素的大小自己设置,深度越深希尔算法消耗越大,但是希尔后的列表越趋近有序,直接查插入时消耗越小,极限情况下希尔排序后序列已经完全有序,直接插入消耗约等于零。

Java实现:

public class ShellInsert extends BaseSort{public static long COUNT;//计数private static int DEEP = 1;/** * 希尔插入算法 * @param list 随机元素 * @param span 跨度 * @param deep 希尔深度 * @return */public static Integer[] sort(Integer[] list, int span, int deep){int size = list.length;for(int i=span;i<size;i++) {COUNT++;if(list[i]<list[i-span]) {int j = i-span;int x = list[i];COUNT++;while(j>-1 && x < list[j]) {COUNT++;list[j+span] = list[j];j-=span;}list[j+span] = x;}}System.out.print("第"+DEEP+++"次排序过后:");print(list);//递归排序if(span/2>=1 && deep>1) {sort(list,span/2,deep-1);}return list;}}

对100个随机元素深度设置3,测试结果:

[71,125,-124,96,-16,25,184,0,121,64,156,49,-26,23,-135,0,3,-37,15,-119,-128,142,90,48,184,154,156,-31,-109,-188,-78,-102,-48,75,-31,29,184,193,146,74,8,146,21,-83,150,122,19,-76,-34,5,-89,-179,61,-30,126,-58,-106,31,20,61,-100,92,-47,25,87,161,-195,-183,-181,58,-159,-108,31,-11,-146,-39,-54,-79,-14,153,-5,154,177,-45,-111,-6,9,6,128,75,65,-180,118,195,195,38,173,39,-184,-13]Sorting..............第1次排序过后:[-89,-179,-124,-30,-16,-58,-106,0,20,61,-100,49,-47,23,-135,0,-195,-183,-181,-119,-159,-108,31,-11,-146,-39,-54,-79,-109,-188,-78,-102,-48,-45,-111,-6,9,6,128,74,8,-180,21,-83,150,38,19,-76,-184,-13,71,125,61,96,126,25,184,31,121,64,156,92,-26,25,87,161,3,-37,15,58,-128,142,90,48,184,154,156,-31,-14,153,-5,154,177,75,-31,29,184,193,146,75,65,146,118,195,195,122,173,39,-34,5]第2次排序过后:[-89,-179,-124,-109,-188,-78,-106,-48,-45,-111,-100,9,-47,23,-135,0,-195,-183,-181,-119,-159,-108,-76,-184,-146,-39,-54,-79,-30,-16,-58,-102,0,20,-31,-6,49,-26,25,74,8,-180,-37,-83,58,-128,19,31,-34,-13,71,125,-31,-14,126,-5,154,31,75,61,29,92,6,128,75,65,3,21,15,150,38,142,39,-11,5,154,156,61,96,153,25,184,177,121,64,156,184,193,146,87,161,146,118,195,195,122,173,90,48,184]第3次排序过后:[-146,-179,-135,-109,-195,-183,-181,-119,-159,-128,-100,-184,-89,-39,-124,-79,-188,-180,-106,-102,-45,-111,-76,-6,-47,-26,-54,0,-31,-78,-58,-83,0,-108,-31,9,-34,-13,5,74,-30,-16,-37,-48,15,20,19,31,29,-11,6,125,8,-14,3,-5,25,31,38,61,39,23,25,128,75,61,96,21,58,150,75,121,49,90,48,154,146,65,126,146,118,184,177,122,64,92,71,184,156,87,161,153,154,195,195,142,173,156,184,193]希尔比对消耗:416[-146,-179,-135,-109,-195,-183,-181,-119,-159,-128,-100,-184,-89,-39,-124,-79,-188,-180,-106,-102,-45,-111,-76,-6,-47,-26,-54,0,-31,-78,-58,-83,0,-108,-31,9,-34,-13,5,74,-30,-16,-37,-48,15,20,19,31,29,-11,6,125,8,-14,3,-5,25,31,38,61,39,23,25,128,75,61,96,21,58,150,75,121,49,90,48,154,146,65,126,146,118,184,177,122,64,92,71,184,156,87,161,153,154,195,195,142,173,156,184,193]直接比对消耗:618[-195,-188,-184,-183,-181,-180,-179,-159,-146,-135,-128,-124,-119,-111,-109,-108,-106,-102,-100,-89,-83,-79,-78,-76,-58,-54,-48,-47,-45,-39,-37,-34,-31,-31,-30,-26,-16,-14,-13,-11,-6,-5,0,0,3,5,6,8,9,15,19,20,21,23,25,25,29,31,31,38,39,48,49,58,61,61,64,65,71,74,75,75,87,90,92,96,118,121,122,125,126,128,142,146,146,150,153,154,154,156,156,161,173,177,184,184,184,193,195,195]

我们把深度加深到5试下:
[-176,-54,59,73,175,-121,145,-43,80,6,45,-199,78,126,135,-194,170,-145,-94,-1,-160,-19,-180,80,121,126,-188,78,-110,38,-44,-97,-130,-151,136,172,-128,105,63,-140,-108,-191,-185,-76,-130,-143,174,20,-197,36,135,68,-160,39,-62,-48,-55,-117,-8,72,-53,86,54,-29,-148,-35,128,-83,-38,69,-104,63,65,-29,-97,71,-198,88,-124,-72,177,-78,-116,-37,134,-113,-71,15,-50,12,94,157,11,-98,-174,40,-93,23,-133,196]Sorting..............第1次排序过后:[-176,-54,-160,39,-62,-121,-55,-117,-8,6,-53,-199,54,-29,-148,-194,128,-145,-94,-1,-160,-19,-180,-29,-97,71,-198,78,-124,-72,-44,-97,-130,-151,134,-113,-128,15,-50,-140,-108,-191,-185,-98,-174,-143,-93,20,-197,36,135,68,59,73,175,-48,145,-43,80,72,45,86,78,126,135,-35,170,-83,-38,69,-104,63,65,80,121,126,-188,88,-110,38,177,-78,-116,-37,136,172,-71,105,63,12,94,157,11,-76,-130,40,174,23,-133,196]第2次排序过后:[-176,-198,-160,-124,-72,-121,-97,-130,-151,6,-113,-199,15,-50,-148,-194,-191,-185,-98,-174,-160,-93,-180,-197,-97,71,-188,59,-110,-62,-48,-78,-117,-37,72,-53,-128,54,-29,-140,-108,128,-145,-94,-130,-143,-19,20,-133,36,126,-54,78,39,38,-44,-55,-116,-8,134,45,-71,78,63,12,-35,157,-83,-76,-1,-104,63,23,-29,121,135,68,88,73,175,177,145,-43,80,136,172,86,105,126,135,94,170,11,-38,69,40,174,65,80,196]第3次排序过后:[-176,-198,-188,-194,-191,-185,-145,-174,-160,-143,-180,-199,-133,-71,-160,-140,-110,-121,-98,-130,-151,-116,-113,-197,-128,-50,-148,-124,-108,-62,-97,-94,-130,-93,-104,-53,-97,-29,-29,-54,-72,-35,-48,-83,-117,-38,-43,20,15,36,78,59,12,39,38,-78,-76,-37,-19,40,23,54,80,63,68,88,73,-44,-55,-1,-8,63,45,65,86,105,78,128,94,170,11,6,69,80,136,71,121,135,126,135,157,175,177,145,72,134,174,172,126,196]第4次排序过后:[-176,-198,-188,-194,-191,-199,-145,-174,-160,-143,-180,-197,-133,-130,-160,-140,-113,-185,-128,-94,-151,-124,-110,-121,-98,-83,-148,-116,-108,-62,-97,-78,-130,-93,-104,-53,-97,-71,-117,-54,-72,-35,-48,-50,-76,-38,-43,20,15,-44,-55,-37,-19,39,23,-29,-29,-1,-8,40,38,36,11,6,12,63,45,54,78,59,68,80,73,65,80,63,69,88,94,71,86,105,72,128,136,170,121,135,78,134,157,172,126,145,126,135,174,175,177,196]第5次排序过后:[-194,-198,-199,-176,-191,-197,-145,-180,-188,-143,-174,-185,-140,-130,-160,-133,-113,-160,-128,-110,-151,-124,-108,-148,-116,-104,-130,-98,-94,-121,-97,-83,-117,-97,-78,-76,-93,-72,-62,-54,-71,-55,-48,-50,-53,-38,-44,-35,-37,-43,-29,-1,-29,11,6,-19,20,15,-8,39,23,12,40,38,36,63,45,54,78,59,65,80,63,68,80,73,69,86,94,71,88,105,72,121,135,78,126,136,126,128,145,170,134,157,172,135,174,175,177,196]希尔比对消耗:829[-194,-198,-199,-176,-191,-197,-145,-180,-188,-143,-174,-185,-140,-130,-160,-133,-113,-160,-128,-110,-151,-124,-108,-148,-116,-104,-130,-98,-94,-121,-97,-83,-117,-97,-78,-76,-93,-72,-62,-54,-71,-55,-48,-50,-53,-38,-44,-35,-37,-43,-29,-1,-29,11,6,-19,20,15,-8,39,23,12,40,38,36,63,45,54,78,59,65,80,63,68,80,73,69,86,94,71,88,105,72,121,135,78,126,136,126,128,145,170,134,157,172,135,174,175,177,196]直接比对消耗:267[-199,-198,-197,-194,-191,-188,-185,-180,-176,-174,-160,-160,-151,-148,-145,-143,-140,-133,-130,-130,-128,-124,-121,-117,-116,-113,-110,-108,-104,-98,-97,-97,-94,-93,-83,-78,-76,-72,-71,-62,-55,-54,-53,-50,-48,-44,-43,-38,-37,-35,-29,-29,-19,-8,-1,6,11,12,15,20,23,36,38,39,40,45,54,59,63,63,65,68,69,71,72,73,78,78,80,80,86,88,94,105,121,126,126,128,134,135,135,136,145,157,170,172,174,175,177,196]


从时间复杂度来考虑希尔插入排序很不稳定的,消耗需要希尔和直接排序两部分一起计算,结果跟自己设置的跨度和深度有关,复杂度很难计算,经验值是O(n^1.3)

        从稳定性来看该排序是非稳定的,因为经过n次跨度后和对调后原始的两个元素的相对位置是无法保证的。

        空间复杂度从代码中也可以看得出都是通过位置的移动来完成的,所以复杂度很低,O(1),几乎可以不考虑。
原创粉丝点击