桶排序
这个算法就好比有若干个桶,我们以10为例,编号从0~10。每出现一个数,就在对应编号的桶中放一个小旗子,最后只要数数每个桶中有几个小旗子就OK了。例如2号桶中有1个小旗子,表示2出现了一次;3号桶中有1个小旗子,表示3出现了一次;5号桶中有2个小旗子,表示5出现了两次;8号桶中有1个小旗子,表示8出现了一次。
#include<stdio.h>
int main()
{
int a[100],t,max=sizeof(a)/sizeof(int);
for(int i=0;i<max;i++)
a[i]=0;
for(int j=0;j<5;j++)
{
scanf("%d",&t);
a[t]++;
}
for(int k=0;k<max;k++)
for(int y=0;y<a[k];y++)
printf("%d ",k);
return 0;
}
这是一个非常快的排序算法。桶排序从1956年就开始被使用,该算法的基本思想是由E.I. Issac和R.C. Singleton提出来的。其实这并不是真正的桶排序算法,真正的桶排序算法要比这个更加复杂。 我们目前学习的简化版幅排序算法,其本质上还不能算是一个真正意义上的排序算法。为什么呢?例如遇到下面这个例子就没辙了。
现在分别有5个人的名字和分数:huhu 5分、haha3分、xixi5分、hengheng 2分和garrishou8分.请按照分数从高到低,输出他们的名字。即应该输出gaos you、huhu、xi xi、hands、heng解。发现问题了没有?如果使用我们刚才简化版的桶排序算法仅仅是把分数进行了排序。最终输出的也仅仅是分数,但没有对人本身进行排序。