希尔排序(Shellsort)

希尔排序,也称递减增量排序算法,是插入排序的一种高速而稳定的改进版本。它的作法不是每次一个元素挨一个元素的比较。而是初期选用大跨步(增量较大)间隔比较,使记录跳跃式接近它的排序位置;然后增量缩小;最后增量为 1 ,这样记录移动次数大大减少,提高了排序效率。希尔排序对增量序列的选择没有严格规定。

算法的具体步骤为:

  1. 先取一个正整数 d1所有距离为 d1的倍数的记录看成一组,然后在各组内进行插入排序。
  2. 然后取 d2( d2 < d1 ),重复1中的操作,进行排序。
  3. 直到d=1。

一般的,取d1=n/2,d2=d1/2,dk=dk-1/2,...直到d=1;

已知的最好步长串行是由Sedgewick提出的 (1, 5, 19, 41, 109,...)。

希尔排序是不稳定的。

 1 void shellsort(int *data, size_t size)
 2 {
 3     for (int gap = size / 2; gap > 0; gap /= 2)
 4         for (int i = gap; i < size; ++i)
 5         {
 6  
 7              int key = data[i];
 8              int j = 0;
 9              for( j = i -gap; j >= 0 && data[j] > key; j -=gap)
10              {
11                 data[j+gap] = data[j];
12               }  
13              data[j+gap] = key;
14          }
15 }

 

posted @ 2013-04-03 22:40  yitianke  阅读(356)  评论(0编辑  收藏  举报