希尔排序
希尔排序是一种基于插入排序的快速排序算法。对于大规模乱序数组插入排序很慢,因为它只会交换相邻的元素,因此元素只能一点一点的从数据的一段移动到另一端。例如,如果数据最小的元素正好在数据的尽头,要将它挪到正确的位置就需要移动N-1次。希尔排序为了加快速度简单地改进了插入排序,交换了不相邻的元素以对数据的局部进行排序,并最终用插入排序将局部有序的数组排序。
希尔排序的思想是使数组中任意间隔为h的元素是有序的。这样的数组被称为h有序数组。换句话说,一个h有序数组就是h个相互独立的有序数组编织在一起组成的一个数组。在进行排序时,如果h很大,我们就能够将元素移动到很远的地方,为实现更小的h有序创造方便。 一下算法使用了序列1/2(3^k-1),从N/3开始递减至1.我们把这个序列称为递增序列。(很多论文研究了各种不同的递增序列,但都无法证明某个序列是“最好的”)
好的递增序列的共同特征:
① 最后一个增量必须为1;
② 应该尽量避免序列中的值(尤其是相邻的值)互为倍数的情况。
希尔排序更高效的原因是它权衡了子数组的规模和有序性。排序之初,各个子数组都很短,排序之后子数组都是部分有序的,这种情况都很适合插入排序。子数组部分有序的程度取决于递增序列的选择。透彻理解希尔排序的性能至今仍是一项挑战。
public class Shell {
//希尔排序
public static void sort(Comparable[] a){
//按升序排列
int N = a.length;
int h = 1;
while(h < N /