希尔排序
希尔排序的思想是使数组中任意间隔为h的元素都是有序的。这样的数组被称为h有序数组。换句话说,一个h有序数组就是h个互相独立的有序数组编织在一起组成的一个数组。在进行排序时,如果h很大,我们就能将元素移动到很远的地方,为实现更小移动提高排序效率。用这种方式,我们都能够将数组排序。这就是希尔排序。
证明
研究希尔排序性能需要的数学论证超出了能力范围,没有找到相关资料,以后在研究吧,看下希尔排序的轨迹吧(下图)。
特点
1、它权衡了子数组的规模和有序性。
2、希尔排序也可以用于大型数组。它对任意排序(不一定 是随机的)的数组表现也很好。
3、不需要使用额外的内存空间。
优化:通过调整间距对于具体的数据有很明显的优化效果,但是并没有最优一说。
public void shellSort(int[] arr) {
int N=arr.length;
int h=1;
//在插入排序中加入一个外循环来将 h 按照递增序列递减.
while(h<N/3) h=3*h+1;
while(h>=1){
for(int i=h;i<N;i++){
for(int j=i;j>=h&&arr[j-h]>arr[j];j-=h){
swap(arr,j,j-h);
}
}
h=h/3;
}
}
public static void swap(int[] arr, int a, int b) {
arr[a] = arr[a] + arr[b];
arr[b] = arr[a] - arr[b];
arr[a] = arr[a] - arr[b];
}
放在最后、最后、最后: