/**
* 希尔排序:实质上是采用了分组插入的方法。先将整个待排序记录序列分割成几组,从而减少
* 参与插入排序的数据量,对每组分别进行直接插入排序,然后增加每组的数据量,重新分组。
* 这样当经过几次分组排序后,整个序列中的记录基本有序时,再对全体记录进行一次直接插入排序。
* 希尔排序对记录的分组,不是简单的逐段分割,而是将相隔某个增量的记录分成一组。
*
* 希尔排序:实质上是采用了分组插入的方法。先将整个待排序记录序列分割成几组,从而减少
* 参与插入排序的数据量,对每组分别进行直接插入排序,然后增加每组的数据量,重新分组。
* 这样当经过几次分组排序后,整个序列中的记录基本有序时,再对全体记录进行一次直接插入排序。
* 希尔排序对记录的分组,不是简单的逐段分割,而是将相隔某个增量的记录分成一组。
*
* */
/**
* @param array 需要排序的数组
* @param n 数组的长度 n=array.lenth
* */
public static void shellInsert(int[] array, int n) {
int dk = n, j;
do {
dk = dk/3; // 设置增量值,在数据量比较小的时候用这个比较合适
for (int i=dk; i<array.length; ++i) {
if (array[i]<array[i-dk]) {
int temp = array[i];
//j>=0
for (j=i-dk; j>=0&&array[j]>temp; j-=dk) {
array[j+dk] = array[j];
}
array[j+dk] = temp;
}
}
System.out.println(Arrays.toString(array));
} while(dk>1);
}