代码改变世界

希尔排序

2017-12-14 13:39  woodzcl  阅读(222)  评论(0编辑  收藏  举报

最近被算法虐了,所以,有事没事,我就得找找算法的茬!嘿嘿

话说,突然想起以前上学时,老师教过一个叫做希尔排序的算法。

主要是名字很有魅惑力啊,依稀记得似乎又不是什么重点排序法,但它就牛在,古往今来,所有算法的设计者都是线性思维的套路时,这个叫希尔的人在中间加了一个叫做不连续增量的概念。估计,就凭这点,这个不怎么样的算法总是被任何算法教材和任何算法老师拿来说说,但都是点到为止,因为从时间复杂度上看,它也却是就这么回事。

不是说找茬吗,嘿嘿,接着说啊:想着重新学学吧,那得买本书!对,就这么干,千挑万选,最后还是相信大品牌,清华本科生教材,名厂名牌,值得信赖?

错了,今天的茬就是“清华”,哈哈,情节跳跃有点儿大,请别介意。

清华的教材,我才学了几个排序算法,结果都有错。其中,就有这个大名鼎鼎的希尔老先生得啊,难道当年老先生没有留下demo?所以,现在全要靠清华的老师自己补充吗?

————————————

闲话不聊,如果,你也想学希尔排序,那我给你一个,保证无错误的版本。

//sort.c

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

 

void insertsort_gap(int arr[], int len,  int start, int gap)

{

    int temp, i, j;

    for(i=start+gap; i<len; i+=gap)

    {

        if (arr[i-gap]>arr[i])

        {

            temp = arr[i];

            j = i;

            do

            {

                arr[j] = arr[j-gap];

                j -= gap;

            }

            while(j-gap>=0&&arr[j-gap]>temp);

            arr[j] = temp;

        }

    }

}

 

void shellsort(int arr[], int len, int delta[], int m)

{

    int i, start, gap;

    for(i=m-1; i>=0; i--)

    {

        gap = delta[i];

        for(start=0; start<gap; start++)

        {

            insertsort_gap(arr, len, start, gap);

        }

    }

}

 

void main()

{

    int arr[] = {22, 13, 17, 29, 46, 58, 11, 1, 8, 9, 76};

    int len = sizeof(arr)/sizeof(int);

 

    int delta[] = {4, 2, 1};

    int m = sizeof(delta)/sizeof(int);

 

    shellsort(arr, len, delta, m);

    for(int i=0; i<len; i++)

    {

        printf("%d ", arr[i]);

    }

 

    printf("\n");

}

//result

# ./sort
1 8 9 11 13 17 22 29 46 58 76

Finally:

我们国家基础本来就弱,碰到清华这么牛的学校既然还在误导学生,情以何堪?

别深想,其实,我也不过就在找茬而已。

最近被算法和人都虐了,对人对事都有点儿敌对情绪了。

哎,这样不好,我得改啊。哈哈