相比于速度较慢的简单排序---冒泡排序、插入排序和选择排序,在之前也介绍了一种使用递归算法的归并排序(速度虽快,但空间消耗大,需要数组大小的辅助空间)。希尔排序和快速排序是我们常用的两种高级排序算法,其中希尔排序的时间复杂度为O(N*(logN)2),快速排序的时间复杂度为O(N*logN),而且和归并排序不一样,不需要那么大的辅助空间。

 

一、希尔排序

希尔排序基于插入排序,但新增一个特性,可以使性能得到很大的提升。希尔排序对几千个数据量的,中等规模的排序是比较适用的。在最坏和平均条件情况下,执行的效果基本上一样。其实你可以将希尔排序看作N-增量排序算法。同时在每一趟排序结束后将N减小,直到N等于1。一般使用的算法为:N=(N-1)/3。

希尔排序实现代码如下:

 1 /**
 2      * 针对array数组进行shell排序,排序的增量计算采用:h = (h-1)/3
 3      * 
 4      * @param array
 5      */
 6     public static void shellSort(double[] array) {
 7         if (array == null || array.length == 0) {
 8             return;
 9         }
10 
11         int nItems = array.length;
12         int h = 1;
13         while (h < nItems / 3) {
14             h = h * 3 + 1;
15         }
16 
17         while (h > 0) {
18             for (int i = h; i < nItems; i++) {
19                 double tmpValue = array[i];
20                 int j = i;
21                 while (j > h - 1 && array[j - h] > tmpValue) {
22                     array[j] = array[j - h];
23                     j -= h;
24                 }
25                 array[j] = tmpValue;
26             }
27             h = (h - 1) / 3;
28         }
29     }
View Code

相关文章:

  • 2018-02-15
  • 2021-10-18
  • 2021-05-19
  • 2021-08-22
  • 2022-12-23
  • 2021-07-19
  • 2022-12-23
猜你喜欢
  • 2022-01-08
  • 2021-09-27
  • 2021-05-01
  • 2021-11-07
  • 2018-08-10
  • 2022-12-23
相关资源
相似解决方案