最快最简单的排序——桶排序

期末考试结束了,老师要把小兔子班上的同学们的分数按照从高到低排序。小兔子班上有5个同学,分别考了5分、3分、5分、2分和8分。(满分是10分哦嘻嘻)。接下来从大到小排序,排序后是8,5,5,3,2。编写一段程序将5个数从大到小输出:
对于这个问题的解决,我们申请一个大小为11的数组int a[11]。现在有11个变量,编号从a[0]-a[10]。首先我们将a[0]-a[10]都初始化为0,表示这些分数还没有人得过。例如,当a[0]为0即表示目前没有人得过0分,a[10]为0表示没有人得过10分。
下面开始处理每个人的分数,第一个人的分数是5分,就将相对应的a[5]的值在原来的基础上增加1,即将a[5]的值从0变为1,表示5分出现了一次。第二个人的分数是3分,将a[3]的值从0改为1,表示3分出现了1次。第三个人的分数也是5分,所以将a[5]的值从1改为2。表示5分出现了2次。第4 个人是2分,即a[2]从0改为1。第五个人是8分则将a[8]的值从0改为1。
从上面的描述中我们可以发现a[0]-a[10]中的数值就是0分到10分每个分数出现的次数。我们只需要将出现过的分数打印出来,出现几次打印几次就可以了。
a[0]为0,表示“0”没有出现过,不打印。
a[1]为0,表示“1”没有出现过,不打印。
a[2]为1,表示“2”出现过一次,打印2。

a[5]为2,表示“5”出现过2次,打印5 5。
以上述规律,最终屏幕输出“2 3 5 5 8”
完整代码如下:

#include <stdio.h>
int main()     {
int a[11],i,j,t;
for(i = 0,i++,i<=10)
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;
}

现在输入n个0-1000的整数,将它们从小到大排序。我们需要1001 个桶来表示0-1000之间每一个数出现的次数,代码如下:

#include <stdio.h>
int main()
{
int a[1001],i,j,t,n;
for(i = 0,i<=1000;i++)
a[i] = 0;
scanf("%d",&n);//输入一个数n,表示接下来有n个数
for(i = 1;i<=n ;i++) //循环读入n个数并进行桶排序
{
scanf("%d",&t);//把每一个数读到变量t中
a[t]++;//进行计数,对编号为t的桶放一个小旗子
}
for(i = 1000;i>=0; i--)
for(j = 1; j<=a[i];j++)
printf("%d",i);
getchar();getchar();
return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值