关于希尔排序

先贴出几个我认为很有参考价值的网址:

http://student.zjzk.cn/course_ware/data_structure/web/flashhtml/shell.htm

http://blog.csdn.net/21aspnet/article/details/7199579

大概是明白“希尔排序”最初版本的操作方法了,举个简单的例子来看看这个算法的过程。

假设一个数组里面有15个数字:1,99,635,23,100,39,123,234,345,2,232,10,299,934,35(注:|||是分隔符)


第一趟排序,gap = 7。

分组情况:1  99  636  23  100  39  123  ||| 234  345  2  232  10  299  934  |||  35

完成之后:1  99  2  23  10  39  123  |||  35  345  635  232  100  299  934  ||| 234

分隔单位中的每一位相对于别的分隔单位已经有序,如 1  35  234 和 99 345 和 2 635以此类推


第二趟排序,gap = 3。

分组情况:1  99  636  ||| 23  100  39 ||| 123 234  345  |||  2  232  10  ||| 299  934    35

完成之后:1  10  2  |||  23  35  39  ||| 123  99  100  |||  299  232  234  ||| 635  934  345


第三趟排序,gap = 1。

分组情况:数组中每个元素自己一组

完成之后:1  2  10  23  35  39  99  100  123  232  234  299  345  635  934

看别的博客说此时退化成了“快速排序”(又是个陌生的东西,哎,算法白学了)?不清楚,暂时就这样子理解:分组之后,分隔单位对应位置有序,然后划分地更细,逐渐排好序……

我认为希尔排序的代码还是很神奇的,真不知道前人是怎样想出来这个算法并实现的,点个赞先奋斗奋斗奋斗


对了,忘记贴代码了。

#include <stdio.h>
#include <stdlib.h>

void shellSort(int *,int);
void printfV(int *,int);

int main()
{

    int v[] = {1,99,635,23,100,39,123,234,345,2,232,10,299,934,35};
    int num = sizeof(v)/sizeof(int);
    printf("total number is %d\n",num);
    shellSort(v,num);
    printf("The last result is:\n");
    printfV(v,num);
    return 0;
}

void shellSort(int *v,int n)
{
    int i,j,gap,tmp;
    for(gap = n/2; gap > 0; gap /= 2)
    {
        for(i = gap; i < n; i++)
        {
            for(j = i - gap; j >= 0 && *(v+j) > *(v+j+gap); j -= gap)
            {
                tmp = *(v+j);
                *(v+j) = *(v+j+gap);
                *(v+j+gap) = tmp;
            }
        }
        printfV(v,n);
    }
}


void printfV(int *v,int n)
{
    int i;
    for(i = 0; i < n; i++)
        printf("%-5d",*(v+i));
    printf("\n");
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值