今天来介绍下,在禁用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);
}
}
}
}
}