相比于速度较慢的简单排序---冒泡排序、插入排序和选择排序,在之前也介绍了一种使用递归算法的归并排序(速度虽快,但空间消耗大,需要数组大小的辅助空间)。希尔排序和快速排序是我们常用的两种高级排序算法,其中希尔排序的时间复杂度为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 }