最快最简单的排序——桶排序
程序员文章站
2022-05-13 21:41:11
...
期末考试结束了,老师要把小兔子班上的同学们的分数按照从高到低排序。小兔子班上有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;
}