分析
又叫缩小增量排序。
- 将待排序列,分割成若干子序列进行直接插入排序
- 序列基本有序时,对全体进行直接插入排序
方法
- 选择增量序列, t1,t2,…,tk ,序列依次递减, tk=1
- 按增量序列个数k,进行k次排序
- 根据增量 ti ,对子序列进行直接插入排序。当增量为1时,整个序列作为一个表处理,得到排序后的数组
代码
public static void ShellInsertSort(int[] array, int dk) {
for (int i = dk; i < array.length; i++) {
// 如果满足插入条件
if (array[i] < array[i - dk]) {
int j = i - dk;
// 存储待排序元素
int x = array[i];
// 后移一个元素
array[i] = array[i - dk];
// 查找有序表的插入位置
for (; j >= 0 && x < array[j]; j -= dk) {
array[j + dk] = array[j];
}
// 插入到正确位置
array[j + dk] = x;
}
}
}
public static void shellSort(int array[]) {
int dk = array.length / 2;
while (dk >= 1) {
ShellInsertSort(array, dk);
common.print(array);
dk = dk / 2;
}
}