希尔排序作为高级排序的守门员,对于初学者而言还是非常友好的。
~ 希尔排序是什么?
希尔排序的就是在进行插入排序前,先对距离较远的元素进行交换,减少插入排序的遍历次数,让h=1的时候多多的break一些;
~ 希尔排序的本质是什么?
(我自认为)本质就是通过提前预排序减少元素离本位的距离,提高h=1时插入的效率。
注意点:希尔排序本质还是插入排序,这对理解逻辑和实现代码至关重要。
public class SellSort {
public static void main(String[] args) {
int[] arr = {-7,6,5,4,3,2,1};
sort(arr);
String s = Arrays.toString(arr);
System.out.println(s);
// for (int i:arr) {
// System.out.print(i+" ");
// }
}
public static void sort(int[]arr){
//首先确定一个增长量h
//每次循环结束后h/2,只要h>1,就不会报错
int h = 1;
while (h < arr.length*0.8){
h = h*2+1;
}
while(h >= 1){
//找到待插入数(记住,希尔排序是插入排序的升级版,本质还是插入排序)
for (int i = h; i < arr.length; i++) {
//从后向前比较
for (int j = i; j >= h; j=j-h) {
if(arr[j] < arr[j-h]){
int temp = arr[j-h];
arr[j-h] = arr[j];
arr[j] = temp;
}else {
break;
}
}
}
h=h/2;
}
}
}