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

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

​ 期末考试完了老师需要将同学们的分数按照高低进行从高到低的排序。班上只有5个同学,这个五个同学分别考了5分、3分、5分、2分和8分(满分10分),接下来就要对分数进行排序,排序后的顺序是8 5 5 3 2。有没有一种办法可以让随机读取5个数,然后按照5个数从大到小进行排序输出?

​ 首先借助一个一维数组解决这个问题。

​ 首先我们申请一个大小为11的数组int a[11]。然后现在已经就有了11个变量,编号为a[0] ~ a[10]。刚开始的时候,我们将a[0] ~ a[10]都初始化为0,表示这些分数暂时都没有人得过。

​ 下面就开始处理每一个人的分数,第一个人分数为5分,那么就对应a[5]的值加1,表示a[5]对应的5分出现过了1次。

​ 第二个人是3分,我们就把对应的a[3]的值给它加1,那么就表示3分也出现过一次了。

​ 按照刚刚的方法,处理第3个、第4个、第5个的分数。

​ 对照处理完之后的数组元素对应的值,1为出现1次,相应的有2和3和8,都各打印一次,5出现过两次,a[5]的值为2,所以打印5两次,最终屏幕会输出 2 3 5 5 8。

#include<stdio.h>
int main()
{
    int a[11] = {0};
    int i, j, t;
    
    for (i = 0; i < 5; i++) { // 循环读入5个数据
        scanf("%d", &t); // 出现过的分数的位置的值加1
        a[t]++;
    }
    
    for (i = 0; i <= 10; i++) {
        for (j = 1; j <= a[i]; j++) { // 每个元素对应的值出现过几次则打印基础
            printf("%d ", i);
        }
    }
    
    return 0;
}
// 输入参数为5 3 5 2 8

​ 观察仔细的朋友们可以发现上面实现的是从小到大的排序,但是我们要求的从大到小的排序,那么只需要改变for (i = 0; i <= 10; i++)为for (i = 10; i >= 0; i–)。

​ 这种方法我们暂时叫它为桶排序。因为其实正在的桶排序要比这个复杂一些。这种方法即对应的11个元素暂时理解为11个桶。

​ 假设现在需要对范围在01000范围内的整数进行排序,我们需要1001个桶,来表示01000之间每一个数出现的次数。我们只需要修改上面代码中的11位1001,和输入1001个数和下面循环做对应的修改即可完成这个范围内的排序。
这是一个简化版的桶排序,本质上还不是一个正在意义上的排序算法。这是为什么呢?因为如果遇到以下这个例子它就没辙了。
现在有5个人的名字和分数:huhu 5分、haha 3分、xixi 5分、hengheng 2分、gaoshou 8分。请按照以上的分数从高到低的进行排序,输出他们的名字。如果我们使用刚刚简化版的桶排序仅仅是把分数进行了排序。最终输出的也仅仅是分数,但没有对人本身进行排序。也就是说我们并不知道排序后的分数对应着哪一个人。对于这个问题,可以使用后面的——冒泡排序。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值