Hello,大家好,我是木头做的鱼,木鱼啊。
今天我要给大家分享一个C语言算法的排序,叫桶排序。名字很有趣。
在我们生活的这个世界中,到处都是被排斥过的东东。战队的时候会按照身高排序,考试的时候的名字需要按照分数来选,网上购物的时候会按照价格排序电子邮箱中的邮件按照时间排序……总之很多东东都需要排序,可以说是排序无处不在,请让我们举个具体的例子来介绍一下排序算法。
首先出场的是我们的主人公,小亨期末考试完了,老师要将同学们的分数按照从高到低排序,小亨的班上只有5个同学这5个同学分别考了5分,3分,5分,2分和8分,唉,考的真是惨不忍睹(满分是10分)。接下来将分数进行从大到小排序,排序后是8 5 5 3 2,你有没有有什么好办法编写一段程序让计算机随机读入5个数,然后将这5个数从大到小写输出请先想一想,至少想15分钟后再往下看吧。
这里我们只需借助一个一维数组就可以解决的问题,你确定你真的仔细想过再往下看哦,首先我们需要申请一个大小为11的数组,int a[11]。OK,现在你已经有了11个变量编号从a[0]~a[10]。刚开始的时候我们将a[0]~a[10]都初始化为0,表示这些分数的还都没有人得过,例如a[0]等于0,就目前还没有人得过0分,同理,同理,a[1]等于0就目前还没有人得过一分……a[10]=0就目前还没有人得过10分。
下面开始处理每一个人的分数。我们将分数全部存完以后,其实是这样的。
完整的代码如下
仔细观察的同学会发现,刚才实现的是从小到大的排序,但是我们要求是从大到小排序,这该怎么办呢?还是先想一想再往下看哦。其实很简单,只需要将。for(i=0;i<=10;i++)改为for(i=10;i>=0;I--)就OK了。
这种排序方法我们暂且叫他桶排序,因为真正的铜牌需要比这个复杂一些,以后再详细讨论,目前此算法已经能够满足我们的需求了。这个算法就好比有11个桶编号从0~10,每出现一个数,都在对应编号桶中放一个小旗子,只最后只要数数,每个桶中有几个小旗子就OK了,例如2号图中一个小旗子表示2出现了一次,3号桶中有一个小旗子表示3出现了一次5号桶中有两个小旗子表示5出现了两次,8号桶中有一个小旗子表示8,出现了一次。
现在你可以尝试输入N个0~1000之间的整数,将他们从大到小排序。提醒一下,如果需要对数据范围在0~1000的指数进行排序,我们需要1001个桶来表示0~1000之间,每一个数出现的次数,这一点一定要注意。另外此处的每一个桶的作用其实就是标记每个数出现的次数,因此我喜欢将之前的数组a一换更贴切的名字book(book这个单词有记录标记的意思),实现代码如下。
好了,那么这期博客就在这里,咱们下期再见拜拜。