T^T Online Judge 1728 桶排序粗讲

今天来介绍下,在禁用sort排序的情况下,如何进行低复杂度的排序,这种排序方式被称为,桶排序

桶排序的复杂度是O(n + m), 其中n为待排序元素个数; m为桶的个数, 即排序范围。

举个栗子,对于一串 20 个 0 ~ 100之间的数,进行降序排列。n = 20;排序区间0 ~ 100 共101个数,即m = 101。

现在说下桶排序的步骤:

首先开一个book数组,大小为m值的大小,作用是记录每个元素出现的次数,先将book数组初始化为0。

然后循环读入n个数 t,对每个数t,进行book[ t ]++。

降序排列就外层循环进行数据区间降序,即排序范围降序,如若干个数都介于0~100之间,那外层循环就

for ( int i = 100; i >= 0; i-- )

升序则反之,

内层循环对升序到达book[ i ],即for ( int j = 1; j <= book[ i ]; j++ ) , 看倒序开始枚举的每个数出现了几次,出现几次就打印几次,故输出 i 即可。

来到题感受下:

http://www.fjutacm.com/Problem.jsp?pid=1728

本人AC代码:

#include <cstdio>
#include <algorithm>
using namespace std;
const int Maxx = 1e6 + 7;
int n,  t;
int book[101];

int main() {
    while(scanf("%d", &n) != EOF) {
        for(int i = 0; i <= 100; i++) book[i] = 0;
        int minT = 105;
        for(int i = 1; i <= n; i++) {
            scanf("%d", &t);
            minT = min(minT, t);
            book[t]++;
        }
        for(int i = 100; i >= 0; i--) {
            for(int j = 1; j <= book[i]; j++) {
                if(i != minT) printf("%d ", i);
                else {
                    if(j < book[i]) printf("%d ", i);
                    else printf("%d\n", i);
                }
            }
        }
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值