《啊哈!算法》学习笔记!

第 1 节 最快最简单的排序——桶排序

现在我们举个具体的例子来介绍一下排序算法。
小哼的班上只有 5 个同学,这 5 个同学分别考了 5 分、3 分、5 分、2 分和 8 分,哎考得真是惨不忍睹(满分是 10 分)。接下来将分数进行从大到小排序,排序后是 8 5 5 3 2。你有没有什么好方法编写一段程序,让计算机随机读入 5 个数然后将这5 个数从大到小输出?请先想一想,至少想 15 分钟再往下看吧(__) 。

我们这里只需借助一个一维数组就可以解决这个问题。请确定你真的仔细想过再往下看哦。

具体步骤分析

1.step 1
首先我们需要申请一个大小为 11 的数组 int a[11]。OK,现在你已经有了 11 个变量,编号从 a[0]~a[10]。刚开始的时候,我们将 a[0]~a[10]都初始化为 0,表示这些分数还都没有人得过。
图从《啊哈!算法》书中来
2.step 2
下面开始处理每一个人的分数,第一个人的分数是 5 分,我们就将相对应的 a[5]的值在原来的基础增加 1,即将 a[5]的值从 0 改为 1,表示 5 分出现过了一次;第二个人的分数是 3 分,我们就把相对应的 a[3]的值在原来的基础上增加 1,即将 a[3]的值从 0 改为 1,表示 3 分出现过了一次;以此类推。
1
在这里插入图片描述
3.step 3 ,依次打印出来。
a[0]为 0,表示“0”没有出现过,不打印。
a[1]为 0,表示“1”没有出现过,不打印。
a[2]为 1,表示“2”出现过 1 次,打印 2。
a[3]为 1,表示“3”出现过 1 次,打印 3。
a[4]为 0,表示“4”没有出现过,不打印。
a[5]为 2,表示“5”出现过 2 次,打印 5 5。
a[6]为 0,表示“6”没有出现过,不打印。
a[7]为 0,表示“7”没有出现过,不打印。
a[8]为 1,表示“8”出现过 1 次,打印 8。
a[9]为 0,表示“9”没有出现过,不打印。
a[10]为 0,表示“10”没有出现过,不打印。
最终屏幕输出“2 3 5 5 8”,完整的代码如下

完整的C语言代码如下:

#include <stdio.h> 
int main() 
{ 
 int a[11],i,j,t; 
 for(i=0;i<=10;i++) 
 a[i]=0; //初始化为0 
 
 for(i=1;i<=5;i++) //循环读入5个数
 {
     scanf("%d",&t); //把每一个数读到变量t中
     a[t]++; //进行计数
 } 
 for(i=0;i<=10;i++) //依次判断a[0]~a[10] 
     for(j=1;j<=a[i];j++) //出现了几次就打印几次
          printf("%d ",i); 
 getchar();getchar(); //防止按了任意键后退出运行窗口
 //这里的getchar();用来暂停程序,以便查看程序输出的内容
 //也可以用system("pause");等来代替
 return 0; 
}

输入数据为:

5 3 5 2 8

提示

仔细观察的同学会发现,刚才实现的是从小到大排序。但是我们要求是从大到小排序,
这该怎么办呢?还是先自己想一想再往下看哦。
其实很简单。只需要将 for(i=0;i<=10;i++)改为 for(i=10;i>=0;i–)就 OK 啦,快去试一试吧。
这种排序方法我们暂且叫它“桶排序”。因为其实真正的桶排序要比这个复杂一些,以
后再详细讨论,目前此算法已经能够满足我们的需求了。

最后

这是本人由《啊哈!算法》中学习的,版权为作者啊哈磊所有,如本人侵权,请作者联系本人删除此文,感谢作者啊哈磊。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值