希尔排序是不稳定的,但是它比直接插入排序要快得多。
希尔排序又称为缩小增量排序,这是对直接插入排序的一种改进方法,其过程是:首先以d1 (0<d1<n-1)为步长,把x中n个元素分为d1个小组,使下标距离为d1的元素在同一组中,即x[0],x[d1],x[2d1],...为一组,x[1],x[d1+1],x[2d1+1],...为第二组,而最后一组为x[d1-1],x[2d1-1],x[3d1-1],...,接着在每个组内部进行直接插入排序。然后,以d2(0<d2<d1)为步长,把x中n个元素分为d2个小组,并在每个组内进行直接插入排序。继续缩短步长,知道d=1,即把所有n个元素都看成一组,进行直接插入排序为止。由于随着d的减少,x中n个元素越来越有序,因而记录的比较和移动次数都较少。从理论上和实验上都已证明希尔排序的总比较次数和总移动次数要比直接插入排序少很多。
一般的初次取序列的一半为增量,以后每次减半,直到增量为1。
借用百度百科里的一张图,更直观一些。
// 希尔排序 x待排序数组, n数组长度 private static void shellSort(int[] x, int n) { int i, j, d, t; d = n / 2; //初始步长设为n/2 while (d > 0) { //按照不同步长进行排序 for (i = d; i < x.length; i++) { t = x[i]; j = i - d; while (j >= 0 && x[j] > t) { //比较和移动 x[j + d] = x[j]; j = j - d; } x[j + d] = t; //知道了位置 } d = d / 2; //步长减半 } // 打印排序后的数组 for (int m = 0; m < x.length; m++) { System.out.println(x[m]); } return; }
原文地址:http://blog.csdn.net/zbao6062/article/details/43272527