希尔排序
希尔排序:基于插入排序,添加了一些新特性,提高了执行效率
优点:通过加大插入排序中元素之间的间隔,并对这些间隔的元素进行插入排序,从而减少移动;
当完成该间隔的排序后,希尔排序会减少数据的间隔再进行排序,依次进行。
间隔:间隔的初始值为1,通过h=3*h+1来循环计算,直到该间隔大于数组的大小时停止,最大间隔为不大于数组大小的最大值
间隔的减小,通过h=(h-1)/3来计算
接下来引入代码
public class shellSort { public static void sort(long [] arr) { //初始化一个h 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; } } }
进行测试
import ch02.InsertSort;
public class TestShellSort {
public static void main(String[] args) {
long[] arr = new long[10];
arr[0] = 90;
arr[1] = 12;
arr[2] = 23;
arr[3] = 15;
arr[4] = -4;
arr[5] = 1;
arr[6] = 97;
arr[7] = 4;
arr[8] = 3;
arr[9] = 8;
System.out.print("[");
for(long num : arr) {
System.out.print(num + " ");
}
System.out.print("]");
System.out.println();
ShellSort.sort(arr);
System.out.print("[");
for(long num : arr) {
System.out.print(num + " ");
}
System.out.print("]");
System.out.println();
}
}