一:什么是希尔排序
希尔排序基于插入排序,并添加了新特性,提高效率.
二:插入排序的缺陷
加入一个很小的数值排在最末尾,如果需要正确排序,则需要将所有的数据都向右移动才可以将小的数据排到前面
缺陷: 移动次数太多
三:希尔排序的优点
加大排序中元素之间的间隔,对这些间隔的元素进行插入排序,使数据可以大幅度移动,当完成间隔排序后,希尔排序会减少间隔之间的元素再进行排序,依次进行下去
四:间隔计算
间隔h的初始值为1,通过 h = 3*h + 1 来计算循环,直到该间隔大于数组的大小时停止.最大间隔为不大于数组大小的最大值
五:间隔减少
公式: h = (h -1)/3
六:代码实现
public class ShellSort {
public static void main(String[] args) {
long[] arr = {3,4,7,2,1,0,8};
sort(arr);
System.out.println(Arrays.toString(arr));
}
//希尔排序
public static void sort(long[] arr){
//初始化间隔
int h = 1;
//计算最大间隔
while (h < arr.length/3){
h = h*3 +1;
}
while (h > 0){
//1.插入排序
long tmp = 0;
for (int i = h;i<arr.length;i++){
tmp = arr[i];
int j = i;
if (j > h-1 && arr[j-h] >= tmp){
arr[j] = arr[j-h];
j = j - h ;
}
arr[j] = tmp;
}
//2.减少间隔
h = (h-1)/3;
}
}
}