希尔排序是插入排序的进化版,解决了插入排序中的大规模移动数组的缺点,例如插入排序过程中后面的数字需要移动到最前面,此时数组中的项需要进行大规模的移动需要消耗很到时间。
希尔排序解决了这个问题,他先是设置一个间隔,在这个间隔之间进行排序。然后逐步缩小间隔,最后间隔缩小为1就是插入排序。
代码:
public class ShellSort {
/**
* 排序方法
*/
public static void sort(long[] arr) {
//初始化一个间隔
int h = 1;
//计算最大间隔
while(h < arr.length / 3) {
h = h * 3 + 1;
}
while(h > 0) {
//进行插入排序
long tmp = 0;
for(int i = h; i < arr.length; i++) {
tmp = arr[i];
int j = i;
while(j > h - 1 && arr[j - h] >= tmp) {
arr[j] = arr[j - h];
j -= h;
}
arr[j] = tmp;
}
//减小间隔
h = (h - 1) / 3;
}
}
}