希尔
首先我们知道,插入排序在基本有序时是效率极高的,并且插入排序一大浪费就是交换次数太多,使用希尔可以大大减少交换次数,快速达到基本有序。
其实到最后间隔为1,就是一次快速排序。
这样可以达到加速的效果。
n=nums.lenth
一般我们选择Knuth序列
h=1
h=3*h+1
1 4 13…
package com.Gordon;
public class ShellSort {
public static void sort(int[] arr){
int len=arr.length;
int h=1;
//长度01不动 2比较 3开始用希尔
if (len<=1) return;
if (len==2&&arr[0]>arr[1])
Swap.arr(arr,0,1);
while (h<len/3){
h=3*h+1;
}
for(int gap=h;gap>0;gap=(gap-1)/3){
for (int i=gap;i<arr.length;i++){
for (int j=i; j>gap-1;j-=gap){
if (arr[j]<arr[j-gap])
Swap.arr(arr,j,j-gap);
}
}
}
System.out.println("afterShellSort");
Print.arr(arr);
}
}
PRINT 和 SWAP自写
希尔时间复杂度 最好n的1.3次方
有争议