希尔排序(shellsort)的名称源于它的发明者Donald Shell,该算法是冲破二次时间界的第一批算法之一。希尔排序也叫做缩减增量排序。
package sort;
/*
希尔排序的名称源于它的发明者Donald Shell,该算法是冲破二次时间的一批算法之一。
希尔排序中使用的一个序列叫增量序列(increment sequence).只要h1 = 1, 任何增量序列都是可行的。
原始数组 81 94 11 96 12 35 17 95 28 58 41 75 15
5排序后 35 17 11 28 12 41 75 15 96 58 81 94 95
3排序后 28 12 11 35 15 41 58 17 94 75 81 96 95
1排序后 11 12 15 17 28 35 41 58 75 81 94 95 96
时间复杂度:希尔排序的时间复杂度最坏的情况下为o(N2)
*/
public class ShellSort {
public static<AnyType extends Comparable<? super AnyType>> void shellSort(AnyType[] a){
int j;
for(int gap = a.length / 2; gap > 0; gap /= 2) //每次缩小一半
for(int i = gap; i < a.length; i++){
AnyType tmp = a[i];
for(j = i; j >= gap && tmp.compareTo(a[j - gap]) < 0; j -= gap)//j >= gap是起到了一个哨兵的作用
a[j] = a[j - gap];//如果说他前面一个的值比他后面一个的值要打,那么交换
a[j] = tmp;//这里是当j -= gap;做完之后再来交换值,其实这一句话等同于再上一层的for循环里面来交换
}
}
public static void main(String[] args) {
Integer[] a = new Integer[]{81, 94, 11, 96, 12, 35, 17, 95, 28, 58, 41, 75, 15};
shellSort(a);
for(Integer number : a)
System.out.print(number + ",");
}
}