C语言算法——第1章 一大波数正在靠近——排序

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分。33dc5ecde2144b68b28c5139215accf7.jpg

 下面开始处理每一个人的分数。我们将分数全部存完以后,其实是这样的。66d78418317f4169a74098025e88018a.jpg

 完整的代码如下82cc86770cb04f19b2b32bb060011af6.jpg

c27a2f52949e499daa1a1b2abf3dc8a7.jpg 

 仔细观察的同学会发现,刚才实现的是从小到大的排序,但是我们要求是从大到小排序,这该怎么办呢?还是先想一想再往下看哦。其实很简单,只需要将。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,出现了一次。4468b63d800c400f91bfd9f23c65b441.jpg

 现在你可以尝试输入N个0~1000之间的整数,将他们从大到小排序。提醒一下,如果需要对数据范围在0~1000的指数进行排序,我们需要1001个桶来表示0~1000之间,每一个数出现的次数,这一点一定要注意。另外此处的每一个桶的作用其实就是标记每个数出现的次数,因此我喜欢将之前的数组a一换更贴切的名字book(book这个单词有记录标记的意思),实现代码如下。0faaa1a2536f4bd0a492adbf99214d9f.jpg

 好了,那么这期博客就在这里,咱们下期再见拜拜。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值