排序之桶排序

本文以《啊哈!算法》为教材,个人理解整理。


例:老师要给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个小朋友分数的最高分,也可获得一个符合例题情况的上界。同理,也可以动态获得一个下界。


写着写着突然觉得其实我可以不用思考这么多,应用时本身都是需要根据实际情况进行修改的,我从一个当前定死的算法上去延伸实际应用,面对的可能是无穷无尽的郁闷。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值