1,思想:对序列相同间隔上的元素使用插入排序,同时不断减小间隔直到间隔为1。间隔选取公式,通常为:h=3*h+1(h初始1)。通过增大移动距离,减少移动次数的方式使之比普通插入排序更高效。
2,效率:时间复杂度约N的1.5次方。
3,Java代码实现:
public class ShellSorter {
public static void shellSort(int[] array) {
int len = array.length;
int h = 1;
while (h <= len / 3) {// find max h.
h = h * 3 + 1;
}
//
int outer = 0;
int inner = 0;
int tmp = 0;
while (h > 0) {
for (outer = h; outer <= len - 1; outer++) {// 一次for循环会将所有当前间隔上的元素排成有序。
tmp = array[outer];
inner = outer;
while (inner > h - 1 && array[inner - h] >= tmp) {// 对当前间隔上的元素应用插入排序。
array[inner] = array[inner - h];
inner -= h;
}
array[inner] = tmp;
}// for end.
h = (h - 1) / 3;
}// while.
}
}