希尔排序
希尔排序(Shell's Sort)是插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因D.L.Shell于1959年提出而得名。
希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。
代码演示
public static void shellSort(int array[]) {
if(array==null||array.length<=1) {
return;
}
int n = array.length;
int h =1;
int temp ;
//获取初始h(用来给元素分组的间距,距离为h数的分为一组,并比较大小通过交换位置排序)
//希尔排序的性能不仅取决于h,还取决于h间的数学性质,如何选择h,就看自己理解了,这里用的h参考了算法书中的递增序列
while(h>n/3) {
h = 3*h+1;
}
//开始排序,先按照间距h进行局部排序,随着间距h的减小,最终达到全局排序。
while(h>=1) {//当间距h小于1时,说明排序已完成
//i从间距值h开始逐步递增,将间距为h的值进行比较排序
for(int i =h;i<n;i++) {
//比较间距为h的值之间的大小,由后往前比较,比如i=9,h=3,那就得比较下标为 9,6,3,0 的大小并逐个交换位置,直至下标9的值在正确位置
//由于排序下标是由i=3开始递增的即下标9之前的的位置(0,3,6)都是排好序的
//假设0,3,6,9 对应值为 A,C,D,B,他们大小关系为A<B<C<D,B应该在A和C之间,此时比较过程如下:
//1. B与D比较 B<D,所以交换位置,此时顺序为 A,C,B,D
//2. B与C比较 B<C,所以交换位置,此时顺序为 A,B,C,D
//3. B与A比较 B>A,不满足条件,跳出循环 i+1,变为10,然后接着循环比较 10,7,4,1下标的值,直至i=n,进入下一个h的比较
for(int j = i;j>=h&&array[j]<array[j-h];j-=h) {
//换位置,将小的值往前放
temp = array[j];
array[j] = array[j-h];
array[j-h] = temp;
}
}
//间距值按比例减小,直至间距为0,即没有需要比较的分组了
h =h/3;
}
System.out.println(Arrays.toString(array));
}