希尔排序
原理
1.选定一个增长量h,按照增长量h作为数据分组的依据,对数据进行分组;
2.对分好组的每一组数据完成插入排序;
3.减小增长量,最小减为1,重复第二步操作。
(减为1时,整个数组被分为一组)
增长量h如何确定
int h=1
while(h < 数组的长度/2) {
h=2h+1;
}
循环结束后就可以确定h的最大值
h的减小规则为:
h=h/2
代码
package sort;
import java.util.Arrays;
public class ShellSort {
public static void main(String[] args) {
int[] arr = new int[]{1,23,42,4,24};
shell(arr);
System.out.println(Arrays.toString(arr));
}
public static void shell(int[] array) {
int h = 1;
while(h < array.length/2) {
h = 2*h + 1;
}
while(h>=1) {
//找到待插入的元素
for(int i = h;i < array.length;i++) {
// 把待插入的元素插入到有序数列中
for(int j = i;j >= h;j-=h) {
//待插入的元素是array[j],比较array[j]和array[j-h]
if (array[j] < array[j-h]) {
int tmp = array[j];
array[j] = array[j-h];
array[j-h] = tmp;
} else {
break;
}
}
}
h = h/2;
}
}
}