public class ShellSort {
private ShellSort(){}
//方式一
public static <E extends Comparable<E>> void sort(E[] arr){
int h = arr.length/2;
while(h >= 1){
for (int start = 0; start < h; start++) {
for (int i = start + h; i < arr.length; i += h) {
E t = arr[i];
int j;
for (j = i; j - h >= 0 && t.compareTo(arr[j-h]) < 0 ; j -= h) {
arr[j] = arr[j-h];
}
arr[j] = t;
}
}
h /= 2;
}
}
//方式二
public static <E extends Comparable<E>> void sort1(E[] arr){
int h = arr.length/2;
while(h >= 1){
for (int i = h; i < arr.length; i++) {
E t = arr[i];
int j;
for (j = i; j - h >= 0 && t.compareTo(arr[j-h]) < 0 ; j -= h) {
arr[j] = arr[j-h];
}
arr[j] = t;
}
h /= 2;
}
}
//方式三
public static <E extends Comparable<E>> void sort2(E[] arr){
int h = 1;
while(h < arr.length){
h = h * 3 + 1;
}
System.out.println("---------" + h);
while(h >= 1){
for (int i = h; i < arr.length; i++) {
E t = arr[i];
int j;
for (j = i; j - h >= 0 && t.compareTo(arr[j-h]) < 0 ; j -= h) {
arr[j] = arr[j-h];
}
arr[j] = t;
}
h /= 3;
}
}
public static void main(String[] args) {
Integer[] arr = {123,12,34,56,88,2,41,89,90,11};
ShellSort.sort2(arr);
System.out.println(Arrays.toString(arr));
}
}