本文以《啊哈!算法》为教材,个人理解整理。
例:老师要给5个小朋友进行打分,满分为10分,要求将最终的分数从高到低排序后显示出来。
输入:5 3 5 2 8
输出:8 5 5 3 2
桶排序就像它的名字一样和桶很相似,如分数的范围为0~10,那就可以分为11个“桶”,分别为:
桶0,桶1,桶2,桶3,桶4,桶5,桶6,桶7,桶8,桶9,桶10。所有的桶一开始都是空的。
如果一个小朋友得分为5,就在桶5中放入一个代表物,如旗子,表示得分为5的有1人。同样地,如果一个小朋友得分为3,就在桶3中放入一个旗子,以此类推。
最后,由于要求从高到低排序,因此应该从桶10开始确认每个桶中的旗子数量,有几个旗子就输出几次桶的序号,如桶8一个旗子,桶5两个旗子,输出即为8 5 5。
用C语言表示,需要首先定义一个11位的数组a[11],并将a中每个元素都初始化为0,再循环5次获取5个小朋友的成绩,获取的同时将a中对应位置的数值增加1,如得5分则a[5]++,得8分则a[8]++,以此类推。
最后倒序输出,即从a[10]开始循环,根据每个元素的数值输出相应次数的下标。
int main()
{
int a[11], i, j, t;
for(i = 0; i <= 10; i++)
{
a[i] = 0; //初始化桶内为0
}
for(i = 0; i < 5; i++)
{
scanf("%d", &t);
a[t]++; //将要排序的数字放入相应的桶中
}
for(i = 10; i >= 0; i--) //从大到小排序输出
{
for(j = 1; j <= a[i]; j++)
{
printf("%d ", i);
}
}
return 0;
}
以上是桶排序最简单的思路了,今天学习完这个,我思考它的特征,最初猜测是不是在数值最大和最小范围确定的情况下(现在我还不考虑效率等其他因素),可以使用桶排序解决。但是思考了下,假如例题中分数下界0是确定的,上界是不确定的情况下,只需判断5个小朋友分数的最高分,也可获得一个符合例题情况的上界。同理,也可以动态获得一个下界。
写着写着突然觉得其实我可以不用思考这么多,应用时本身都是需要根据实际情况进行修改的,我从一个当前定死的算法上去延伸实际应用,面对的可能是无穷无尽的郁闷。