思路:
将排序的内容从中间折半进行分组,直到分到最小组,每组1个或两个,然后将组内进行排序,然后再依次合并最小的两个组进行排序,直到合并到只有一个组则排序完成。
代码:
package com.wangyq.datastructrue.sort;
import java.util.Arrays;
public class Shell {
public static void main(String[] args) {
//定义排序前数组,随机数100个
int[] ints = new int[20];
for (int i = 0; i < 20; i++) {
ints[i] = (int) (Math.random() * 20);
}
System.out.println("排序前:" + Arrays.toString(ints));
shell(ints);
System.out.println("排序后:" + Arrays.toString(ints));
}
private static void shell(int[] ints) {
//先分组到最小组
int num = ints.length / 2;
while (num > 0) {
//循环每一组
for (int i = 0; i < num; i++) {
//每一组进行插入排序
for (int j = i + num; j < ints.length; j += num) {
int temp = ints[j];
int k;
for (k = j - num; k >= 0 && ints[k] > temp; k -= num) {
ints[k + num] = ints[k];
}
ints[k + num] = temp;
}
}
System.out.println("排序中:" + Arrays.toString(ints));
num = num / 2;
}
}
}
执行结果:
排序前:[19, 13, 12, 7, 17, 11, 15, 9, 15, 16, 13, 1, 12, 5, 19, 4, 11, 12, 14, 8]
排序中:[13, 1, 12, 5, 17, 4, 11, 9, 14, 8, 19, 13, 12, 7, 19, 11, 15, 12, 15, 16]
排序中:[4, 1, 9, 5, 8, 11, 11, 12, 7, 16, 13, 13, 12, 14, 17, 19, 15, 12, 15, 19]
排序中:[4, 1, 7, 5, 8, 11, 9, 12, 11, 12, 12, 13, 13, 14, 15, 16, 15, 19, 17, 19]
排序中:[1, 4, 5, 7, 8, 9, 11, 11, 12, 12, 12, 13, 13, 14, 15, 15, 16, 17, 19, 19]
排序后:[1, 4, 5, 7, 8, 9, 11, 11, 12, 12, 12, 13, 13, 14, 15, 15, 16, 17, 19, 19]