希尔排序算法

来源:互联网 发布:立领衬衫 知乎 编辑:程序博客网 时间:2024/05/29 12:21

希尔排序

排序,希尔排序,ShellSort

希尔排序有是又称为缩小增量排序。希尔排序通过一定的间隔(增量)将待排序序列分成个子序列(分组),再个子序列进行插入排序,通过不断缩小间隔的大小,最终实现原序列的排序。
希尔排序使用一个序列{h1,h2,…,hk}(叫做增量序列)对待排序序列进行分割。
比如含有10个键值的待排序序列{7,9,2,5,6,1,3,30,28,17}存储于数组a[]中。

a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]7925613302817

第一次 取 h = 10/2 = 5;此时分组为:

a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]7925613302817组1组2组3组4组5组1组2组3组4组5

对每一组的序列进行排序后(使用插入排序):

a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]1325679302817组1组2组3组4组5组1组2组3组4组5

第二次 取 h /=2 = 5/2 = 2(向0取整),从新分组:

a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]1325679302817组1组2组1组2组1组2组1组2组1组2

再次对每一组的序列进行排序:

a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]1325679172830组1组2组1组2组1组2组1组2组1组2

再取 h /=2 = 2/2 = 1 , 分组:

a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]1325679172830组1组1组1组1组1组1组1组1组1组1

可以看到h = 1 时的排序其实就是对整个序列进行插入排序,由于已经现在的序列是一个很好的预排序序列,最后的插值排序算法速度是非常快的。

a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]1235679172830组1组1组1组1组1组1组1组1组1组1

下面是《数据结构与算法-C语言描述》中的实现,可以看到代码第8~14行就是直接插入排序算法。

  1. // 希尔排序 (缩小增量排序) 
  2. void ShellSort(ElementType a[], int N) 

  3.     int i, j, Increment; 
  4.     ElementType temp; 
  5.     for (Increment=N/2; Increment>0; Increment/=2
  6.     { 
  7.         for (i=Increment; i<N; i++) 
  8.         { 
  9.             temp = a[i]; 
  10.             for (j=i; j>=Increment && a[j-Increment]>temp; j-=Increment) 
  11.                 a[j] = a[j-Increment]; 
  12.             a[j] = temp; 
  13.         } 
  14.     } 

0 0