希尔排序可以看作是一种基于插入排序的快速排序算法,对于大规模乱序数组插入排序会很慢,因为它只会交换相邻的两个元素,因此元素只能一步一步的从数组的一端移到另一端。如果一个最小元素正好在数组的尽头,那么它移动到正确的位置就需要N-1次移动。而希尔排序就是对插入排序进行了该做,它是对数据的局部排序,使用插入排序使数据局部有序。
算法思想
希尔排序的思想是是数组中任意间隔为h的元素都是有序的,这样的数组被称为h有序数组。即一个h有序数组就是h个相互独立的有序数组编制在一起组成的一个数组。如下图:
h = 3
2----1—4---2—4---4—4----7—7---6----9—9---12–10–15–11
2——————4——————7——————12
-----1——————4——————6——————10
---------4——————4——————9——————15
---------------2——————7——————9——————11
在进行排序时,如果h很大,我们就能将元素移动到很远的地方,为实现一个更小的h有序创造条件。现在希尔排序的一种方法是对每个h,用插入排序将h和子数组独立的排序。
算法实现
实现代码如下:
public class Shell {
public static void main(String[] args) {
// TODO Auto-generated method stub
Integer[] a = new Integer[]{1,4,6,2,0,3,2,7,8,1,9};
sort(a);
SortUtil.show(a);
}
public static void sort(Comparable[] a){
int size = a.length;
int h = 1;
while(h < size/3){
h = 3*h+1;
}
while(h >= 1){
for (int i = h; i < size; i++) {
for(int j = i;j>=h&&SortUtil.less(a[j], a[j-h]);j--){
SortUtil.exch(a, j, j-h);
}
}
h /= 3;
}
}
}
从上面的实现中可以看出,只是对插入排序算法进行了简单的修改(不了解插入排序的请点这里)。