希尔排序
希尔排序:交换不相邻的元素以对数组的局部进行排序,并最终用插入排序将局部有序数组排序。
思想:使数组中任意间隔为h的元素都是有序的,这样的数组被称为h有序数组。一个h有序数组就是h个互相独立的有序数组编织在一起的数组。
不稳定排序
public static void main(String[] args){
Integer[] a = {23, 21, 4, 6, 7, 5, 11, 1, 12};
show(a);
sellSort(a);
System.out.println(isSorted(a));
show(a);
}
public static void sellSort(Comparable[] array){
int length = array.length;
int h = 1;
while(h < length / 3){
h = 3 * h + 1;//1, 4, 13, 40, 364,1093...
}
while(h >= 1){
//将数组变成h有序
for(int i = h; i < length; i++){
//将a[i] 插入到a[i - h]、a[i - 2h]、 a[i - 3h]之中
for(int j = i; j >= h && less(array[j], array[j - h]); j -= h){
exch(array, j, j - h);
//show(array);
//System.out.println();
}
}
h = h / 3;
}
}
//比较函数,v小于w就返回真
public static boolean less(Comparable v, Comparable w){
return v.compareTo(w) < 0;
}
//交换函数
public static void exch(Comparable[] array, int i, int j){
Comparable temp = array[i];
array[i] = array[j];
array[j] = temp;
}
//打印函数
public static void show(Comparable[] array){
for(int i = 0; i < array.length; i++){
System.out.print(array[i] +" ");
}
System.out.println();
}
//测试元素是否有序
public static boolean isSorted(Comparable[] a) {
//测试元素是否有序
for (int i = 1; i < a.length; i++) {
if (less(a[i], a[i - 1])) {
return false;
}
}
return true;
}