希尔排序(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语言实现( DEV 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(此时和插入排序基本一致),另外,希尔排序是不稳定的。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值