最近被算法虐了,所以,有事没事,我就得找找算法的茬!嘿嘿
话说,突然想起以前上学时,老师教过一个叫做希尔排序的算法。
主要是名字很有魅惑力啊,依稀记得似乎又不是什么重点排序法,但它就牛在,古往今来,所有算法的设计者都是线性思维的套路时,这个叫希尔的人在中间加了一个叫做不连续增量的概念。估计,就凭这点,这个不怎么样的算法总是被任何算法教材和任何算法老师拿来说说,但都是点到为止,因为从时间复杂度上看,它也却是就这么回事。
不是说找茬吗,嘿嘿,接着说啊:想着重新学学吧,那得买本书!对,就这么干,千挑万选,最后还是相信大品牌,清华本科生教材,名厂名牌,值得信赖?
错了,今天的茬就是“清华”,哈哈,情节跳跃有点儿大,请别介意。
清华的教材,我才学了几个排序算法,结果都有错。其中,就有这个大名鼎鼎的希尔老先生得啊,难道当年老先生没有留下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(" ");
}
//result
# ./sort
1 8 9 11 13 17 22 29 46 58 76
Finally:
我们国家基础本来就弱,碰到清华这么牛的学校既然还在误导学生,情以何堪?
别深想,其实,我也不过就在找茬而已。
最近被算法和人都虐了,对人对事都有点儿敌对情绪了。
哎,这样不好,我得改啊。哈哈