排序效率对比-插入排序vs希尔排序

Posted 技术美好生活

tags:

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

对于几十个或者几千个整数进行排序,各种算法程序执行时间没什么差别,但如果要对几十万,几百万或者更多的整数排序,那么就要精心挑选设计一些算法。

看一个例子:

对20万个整数进行排序,一种算法实现如下:

public static <T extends Comparable<? super T>> void insertionSort(T[] a) { if (null == a) { return ; } int j ; for ( int p = 1 ; p < a.length ; p++) { T tmp = a[p] ; for ( j = p ; j > 0 && tmp.compareTo(a[j-1]) < 0 ; j--) { a[j] = a[j-1] ; } a[j] = tmp ; }  }

以上是最基本的插入排序算法:

执行时间 耗时:61秒,1分钟左右


现在增加整数数量,对50万个整数进行排序

执行时间 变成了耗时:557秒 大约需要漫长的10分钟


现在看另外一种算法:

public static <T extends Comparable<? super T>> void shellSort(T[] a) { if (null == a) { return ; }  int j ; for (int gap = a.length ; gap > 0 ; gap/=2) { for (int i = gap ; i < a.length ; i++) { T tmp = a[i] ; for (j = i ; j >= gap && tmp.compareTo(a[j-gap])<0 ; j-=gap) { a[j] = a[j-gap] ; } a[j] = tmp ; } } }

以上是希尔排序算法,

先看看同样是对20万个整数排序:

执行时间 耗时:126毫秒   大概0.1秒


再对50万个整数排序

执行时间 耗时:380毫秒 大概0.4秒  

效率大概比插入排序有5500倍的提升


希尔排序发明者是Donald Shell,于1959年提出,该算法是冲破二次时间屏障的第一批算法之一,不过直到它最初被发现的若干年后才证明了它的二次时间界

原始论文是 D.L.Shell,"A High-Speed Sorting Procedure" Communications of the ACM, 2(1959),30-32



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

希尔排序,何不了解一下?

排序算法-Sort,更高效率的插入排序—希尔排序

直接插入排序 ,折半插入排序 ,简单选择排序, 希尔排序 ,冒泡排序 ,快速排序 ,堆排序 ,归并排序的图示以及代码,十分清楚

排序(选择插入希尔)

高级排序算法之希尔排序

4希尔排序