shell排序的策略:
1.先对子序列进行 直接插入排序 ; 待整个序列基本有序后
2.在对整个序列进行 直接插入排序
【希尔排序,它通过比较相距一定间隔的元素来工作;各趟比较所用的增量随着算法的进行而减小,直到比较相邻元素的最后一趟排序为止。】
希尔排序 有是 也叫作 缩减增量排序。
在使用h进行一趟排序后,所有间隔为h的元素已经排序,此时称是h排序的。
代码:
package ch02;
import util.ArrayUtil;
//取增量值;一种好的取增量的方法是改进希尔排序算法时间性能的关键;
public class ShellSort {
//希尔排序 时间复杂度
public static void doShellSort(int[] array){ //gap 差距 的意思
/增量的选择
for(int gap=array.length/2;gap>0;gap/=2){
//n-gap 趟排序
for(int i=gap;i<array.length;i++){
int tmp = array[i];
int j;
for(j=i;j>=gap&&tmp<array[j-gap];j-=gap){
array[j]=array[j-gap];
}
array[j]=tmp;
}
}
}
public static void main(String[] args) {
// int[] array = new int[]{2,8,6,4,3,9,1};
int[] array = new int[]{58,46,72,95,84,25,37,58,63,12};
ArrayUtil.display(array);
//数组的某个值a[i]是值传递;整个数组是引用传递
doShellSort(array);
ArrayUtil.display(array);
}
}