数组之希尔排序
数组之希尔排序
基本思想:先将原表按增量ht分组,每个子文件按照直接插入排序。再用下一个增量ht/2将文件再分为子文件,再直接插入法排序。直到ht=1时整个文件排好序。直接插入排序其实就是增量为1的希尔排序。
关键:选择合适的增量!
代码
package com.sun.base.Array.text;
/**
* @Author: fei
* @CreateTime:2020-11-26
*/
import java.util.Arrays;
public class Demo06 {
public static void main(String[] args) {
int[] arr = new int[]{10,20,5,3,1,2,-7,-8,-55,100,-5};
for(int h = arr.length/2;h>0;h=h/2){//合理的选取这个增量,然后不断缩小
for(int i = h;i<arr.length;i++){
for(int j = i;j>h-1;j-=h){
if (arr[j] < arr[j - h]) {
int t = arr[j];
arr[j] = arr[j - h];
arr[j - h] = t;
}
}
}
}
System.out.println(Arrays.toString(arr));
}
}
运行

Knuth序列
我们第一次的增量选择数组长度的一半并不是最好的选择,我们可以选择一种叫做克努特序列!
//int h=1;
//h=h*3+1;
package com.sun.base.Array.text;
/**
* @Author: fei
* @CreateTime:2020-11-26
*/
import java.util.Arrays;
public class Demo06 {
public static void main(String[] args) {
int[] arr = new int[]{10,20,5,3,1,2,-7,-8,-55,100,-5};
//Kunth序列
int jiange =1;
while (jiange<=arr.length/3){
jiange=jiange*3+1;
}
for(int h = jiange;h>0;h=h/2){
for(int i = h;i<arr.length;i++){
for(int j = i;j>h-1;j-=h){
if (arr[j] < arr[j - h]) {
int t = arr[j];
arr[j] = arr[j - h];
arr[j - h] = t;
}
}
}
}
System.out.println(Arrays.toString(arr));
}
}


浙公网安备 33010602011771号