插入排序和希尔排序的比较
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 |
由此可见,希尔排序不适合对接近完成排序的数组进行排序。对此类数组排序时,其效率远远低于插入排序。
以上是关于插入排序和希尔排序的比较的主要内容,如果未能解决你的问题,请参考以下文章
插入排序(直接插入排序希尔排序);交换排序(冒泡排序快速排序);选择排序(简单选择排序堆排序);归并排序和基数排序;基于关键词比较的排序算法下界分析