【排序】希尔排序

DL.Shell1959年提出“希尔排序”,它属于插入排序,对直接插入排序算法做出了很大的改进。微笑

如何排序?

设无序序列有N个元素,先将这N个元素分成k组,每一组的间距为d,因为N不一定能整除d,所以实际上可能会有几个元素没有被分组,不过这没有关系,因为总有一次分组会将它们放到组内,因为我让间距d每一次都自减1,当然d最小只能为1,因为它只有N个元素。:)

 

希尔分析:(等实践完下面的代码,再看这段文字能更好地理解:))

希尔排序是按照不同步长对元素进行插入排序。当刚开始元素很无序的时候,步长最大,所以插入排序的元素个数很少,速度很快;当元素基本有序了,步长很小,插入排序对于有序的序列效率很高。所以,希尔排序的时间复杂度会比o(n^2)好一些。

 

/*
前言:但凡我的排序算法的案例,我都是采用统一的风格编写的,可以将他们整合到一起,进行比较,体验算法效率的差异性。
摘要:采用插入排序,对{0, 11, 12, 5,6, 13, 8, 9, 14, 7, 10}进行排序
完成日期:2012-7-13
作者:XX
版本:1.1v
*/
#include <stdio.h>

void PrintList(int a[], int n);
void ShellSort(int a[], int n);

int main()
{
     int a[] = {0, 11, 12, 5, 6, 13, 8, 9, 14, 7, 10};
     int n = 11;

     printf("原序列:\n");
     PrintList(a, n);
     ShellSort(a, n);
     printf("希尔排序后:\n");
     PrintList(a, n);
     return 0;
}

void ShellSort(int a[], int n)
{
     int d = n/2;//分组间距的初始值
     int i = 0;
     int temp = 0;

     for(d= n/2; d > 0; d--)
     {
          for(i = 0; i + d < n; i++)
          {
               if (a[i] > a[i + d]) //第i个元素大于第i + d个,则交换
               {
                    temp = a[i];
                    a[i] = a[i + d];
                    a[i + d] = temp;
               }
          }
     }
}

/*
功能:输出数组
输入:int list[], int n
输出:无
函数调用:无
*/
void PrintList(int list[], int n)
{
     int i;

     for (i = 0; i < n; i++)
     {
          printf("%4d", list[i]);
     }
     printf("\n");
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值