插入排序和希尔排序的比较

Posted 幽流书堂

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了插入排序和希尔排序的比较相关的知识,希望对你有一定的参考价值。

因为封面图的尺寸原因,这篇文章放在了希尔算法前面。请先阅读第二篇文章《希尔排序 Shell sort》。

直插和希尔都属于插入类的排序算法。算法代码从直观上看,虽然希尔排序比插入排序多了一个循环体,但是在处理一些特定类型或大的数组时,希尔排序要快得多。插入排序的平均时间复杂度为 O(n2),希尔排序的平均时间复杂度约为 O(n1.5),最好能到达约 O(n1.3)



以 40 个数据的小数组为例,横向比较两种排序算法对四类数组排序的效率。


random
nearly sorted
insert
shell insert shell
7863
10118 3984 5287
7657 8284 2551 3743
2526 2943 844 1281
2571 2819 1328 1580
2621 2813 854 1370
2351 2464 711 1114
2594 2841 867 1296
2636 2880 1103 1438
2660 2922 871 1347
2366 2668 790 1272
—— —— —— ——
3585 4075 1390 1973


reversed
few unique
insert
shell insert shell
12629
7888 8775 9000
11817 6054 6314 6720
3886 1979 2035 2225
5355 2555 2874 2716
4043 1939 2061 2206
3407 1769 1824 1888
3912 1916 2014 2236
5915 2006 2773 2882
3340 1648 1706 1805
3601 1875 1873 2025
—— —— —— ——
5791 2963 3225 3370

从上表中可知,希尔排序不适合对接近完成排序的数组进行排序,对此类数组,插入排序效率更高。




接下来比较大型数组。第一类数组内容为随机数据(5,000 个元素的数组复制了 5 遍 1,000 个元素的数组,其余为无规律随机数)。


200个
500个
insert
shell insert shell
33682 15577 223686 42350
38086 17210 253942 63824
36663 18579 404379 86518
41110 22960 252967 54353
37982 17815 759208 162327
38108 19773 253337 54493
38272 20082 234091 51646
38090 17756 197220 50765
38203 17370 206500 51059
38198 17366 252673 61058
—— —— —— ——
37839 18449 303800 67839


1,000个
5,000个
insert
shell insert shell
890457 110709 17380274 516480
879036 110613 19671651 518371
920480 126218 17559758 616576
865968 130697 17365887 497473
907081 92292 18253708 511917
923490 127912 19619109 500488
799354 108633 18040008 495456
741646 110533 17951531 500214
876541 111503 22739352 517649
681131 110556 17807823 518618
—— —— —— ——
848518 113967 18638910 519324

随着数据量的增加,二者差别越来越明显。


接下来为接近完成排序的数组。为了节省试验时间,直接使用有序数组做测试。

200个
500个
insert
shell insert shell
1369 5069 2447 14216
1283 4482 6250 37460
1254 4311 6419 37330
1225 4415 2374 12975
1610 5928 1886 11528
1270 4468 2220 12459
1285 4119 3014 16586
1906 7276 2293 12499
1260 5179 1952 10656
2148 8430 6495 37370
—— —— —— ——
1461 5368 3535 20308


1,000个
5,000个
insert
shell insert shell
3762 23368 17231 157667
3368 21988 45355 434495
3736 25941 17023 157829
3857 24440 17119 157889
3966 24486 16994 157880
11702 73196 17069 157725
5829 36713 25831 236814
3929 24328 17197 158032
3601 22599 12079 132451
5414 34540 17091 158714
—— —— —— ——
4916 31160 20299 190950

由此可见,希尔排序不适合对接近完成排序的数组进行排序。对此类数组排序时,其效率远远低于插入排序。

以上是关于插入排序和希尔排序的比较的主要内容,如果未能解决你的问题,请参考以下文章

插入排序(直接插入排序希尔排序);交换排序(冒泡排序快速排序);选择排序(简单选择排序堆排序);归并排序和基数排序;基于关键词比较的排序算法下界分析

算法插入排序——希尔排序+直接插入排序

理解插入排序,希尔排序,选择排序的算法原理

数据结构插入排序希尔排序直接选择排序归并排序基数排序

插入排序(直接插入排序和希尔排序)

插入排序,希尔排序,堆排序