排序之桶排序

原创 2016年05月30日 20:46:05

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


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


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

版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)