读书人

希尔排序(C语言兑现)

发布时间: 2013-04-02 12:35:26 作者: rapoo

希尔排序(C语言实现)
希尔排序(Shell Sort)又称缩小增量排序,因DL.Shell于1959年提出而得名。
假设有这样一个数组{5,8,9,2,6,3,5,1},要求按照从小到大排列,如果使用直接插入排序,要将数组最后的1移到最前面,对于一个小数组来说也许无关紧要,但是当数据多到一定程度时,这种方式显然是很耗费时间的。由此引入希尔排序,基本思想是引入一个常量d来缩小增量。这里0<d<n,n是待排序数组的长度。使用这个改进的希尔排序可以实现数据元素大跨度的移动,拿上述数组来说,1可以直接移到第一位,而不用从最后一位依次向前,这就是这个算法的优势所在。
下面就一个例子进行说明待排序数组:{45,20,80,40,26,58,66,70} d=5时分组:{45,58}{20,66}{80,70}排完后为:{ 45,20,70,40,26,58,66,80}d=3时分组:{45,40,66}{20,26,80}{70,58}{40,66}{26,80}排完后为:{40,20,58,45,26,70,66,80}
下面是C语言实现—EV c++4.9.9.2运行通过)

#include<stdio.h>void shellSort(int data[],int len);int main(void){    int data[] = {45,20,80,40,26,58,66,70};     shellSort(data,8);    system("PAUSE"); }void shellSort(int data[],int len){     int d = len;     int i,j;     while(d > 1)      {         d = (d+1)/2;                  //关键代码          for(i = 0;i < len-d;i++)          {               if(data[i+d] < data[i])               {                   int temp;                   temp = data[i+d];                   data[i+d] = data[i];                   data[i] = temp;               }                              printf("\nd=%d|||||",d);               for(j = 0;j < 8;j++ )               {                   printf("%d,",data[j]);               }                               }     }          printf("\nresults:");     for(j = 0;j < 8;j++ )     {          printf("%d,",data[j]);     }}

希尔排序的执行时间是依赖与增量的选择的,最后一个增量必须为1(此时和插入排序基本一致),另外,希尔排序是不稳定的。

读书人网 >C语言

热点推荐