排序算法——希尔排序

来源:互联网 发布:js 闭包的定义 编辑:程序博客网 时间:2024/06/05 01:21

         希尔排序(Shell Sort)也称为递减增量排序算法,是插入排序的一种高速而安定的改良版。因希尔(Donald L. Shell)于1959年提出而得名。各种实现在如何进行递减上有所不同。

        希尔排序是基于插入排序的以下两点性质而提出改进方法的:
            插入排序在对几乎已经排好序的数据操作时, 效率高, 即可以达到线性排序的效率
            但插入排序一般来说是低效的, 因为插入排序每次只能将数据移动一位
        对有n个元素的可比较资料,先取一个小于n的整数d1作为第一个增量,把文件的全部记录分成d1个组。所有距离为d1的倍数的记录放在同一个组中。先在各组内进行直接插入排序;然后,取第二个增量d2<d1重复上述的分组和排序,直至所取的增量dt=1(dt<dt-1<…<d2<d1),即所有记录放在同一组中进行直接插入排序为止。
该方法实质上是一种分组插入方法。
        在具体实现上,希尔排序的性能与所选取的分组长度序列有很大关系
Code:
  1. #include <stdio.h>  
  2.   
  3. void shell_sort(int a[], int size)  
  4. {  
  5.     int gap, temp;  
  6.     int i, j;  
  7.   
  8.     for (gap = size / 2;gap > 0; gap /= 2) {  
  9.         for (i = gap; i < size; i++) {  
  10.             for (j = i - gap; j >= 0 && a[j] > a[j+gap]; j-=gap) {  
  11.                 temp = a[j];  
  12.                 a[j] = a[j+gap];  
  13.                 a[j+gap] = temp;  
  14.             }  
  15.         }  
  16.     }  
  17. }  
  18.   
  19. main()  
  20. {  
  21.     int a[] = {49, 38, 65, 97, 76, 13, 27, 49, 55, 4}, i;  
  22.     int size = sizeof(a) / sizeof(int);  
  23.     shell_sort(a, size);  
  24.   
  25.     for (i = 0; i < size; i++)  
  26.         printf("%d ", a[i]);  
  27. }