希尔排序
在基础插入排序上进行改进,增加间隔,可以较为快速的将大的值往后放,小的值往前归。再不断缩小间隔的距离,直到间隔唯一变成插入排序。
Kunth序列间隔为h=h*3+1,比二分之一的效率要高。
class Main {
public static void main(String[] args) {
//希尔排序 Kunth序列
int[] arr = {34, 53, 77, 22, 35, 97, 4, 15};
int h = 1;
while ( h < arr.length/3){
h = h * 3 + 1;
}
for ( int gap = h; gap > 0; gap = (gap-1)/3 ){
for ( int j = gap; j < arr.length; j++) {
for ( int i = j; i > gap-1; i-=gap){
if ( arr[i] < arr[i-gap] ) swap(arr, i, i-gap);
}
}
}
print(arr);
}
static void swap(int[] arr, int m, int n){
int temp = arr[m];
arr[m] = arr[n];
arr[n] = temp;
}
static void print(int[] arr){
System.out.println("输出数组:\n");
for ( int i = 0; i < arr.length; i++){
System.out.print(arr[i] + " ");
}
}
}