希尔排序,增强版的插入排序.交换不相邻(相隔为h)的元素对数组进行局部排序,并最终用插入排序局部有序的数组排序.

1.插入排序是希尔排序的特殊情况,h=1;

2.希尔排序的最后一次排序,还是利用的插入排序

希尔排序多数组进行多次排序,而且最后一次还利用插入排序,那为什么希尔排序会比插入排序要快呢?

注意希尔排序最后一次用插入排序(h=1)进行排序时,数组已经局部有序.

而插入排序的性能跟数组的初始状态有关,当数组的顺序时,插入排序仅需N-1次比较,0次交换.当数组逆序时,插入排序要N^2/2次比较,N^2/2次交换.

因此,对局部有序的数组进行插入排序一定比随机状态下的数组进行插入排序要快!

 

希尔排序

   1: public void sort(Comparable[] a) {
   2:         // TODO Auto-generated method stub
   3:         int N = a.length;
   4:         int h = 0;
   5:         while (h < N / 3)
   6:             h = 3 * h + 1;
   7:         while (h >= 1) {
   8:             for (int i = h; i < a.length; i++)
   9:                 for (int j = i; j >= h && less(a[j], a[j - h]); j -= h){
  10:                     exec(a, j, j - h);
  11:                     show(a);
  12:                 }
  13:             h = h / 3;
  14:         }
 
    

15: }

 
测试结果
p_w_picpath

 

PS:递增序列:

代码中,h = 1,4,13,40,121,364,…,1/2(3^k-1)就是一个递增序列.k表示希尔排序的次数.

一般,该递增序列足够使用