Description
基数排序是借助“分配”和“收集”两种操作进行排序的一种内部排序算法,对已知的数据进行基数排序。
Input
输入数据有多组,对于每组测试数据 第一行一个整数n(n <= 20000),表示有n个整数要进行排序,第二行n个整数
Output
对于每组测试数据,输出没轮分配收集后,生成的n个整数序列,每个数以空格隔开
Sample Input
9
9 8 7 6 5 4 3 2 1
Sample Output
1 2 3 4 5 6 7 8 9
其实这道题我做着有点奇怪,题目中是说把每次分配收集后的数据输出来,但是我输出反而过不了,不输出每次,只输出最后结果却可以过了,应该是题目描述有误吧.
代码区:
#include <iostream>
#include <list>//要使用list需要加的头文件
using namespace std;
int GetKey(int v, int k) {//v为数字,k为要取到的位数,得到v数上k位的数字
int key;
while (k > 0) {//很基本的操作
key = v % 10;
v /= 10;
k--;
}
return key;
}
//分配函数
void Distribute(int *a, int n, int p, list<int> *list) {//n为数字个数
for (int i = 0; i < n; i++) {
int temp = GetKey(a[i], p);//取得p位上的数字存放在temp中
//temp为0~9,对应list[0~9],分别存放不同数字的数
list[temp].push_back(a[i]);//将取得的数字推入list的最后面
}
}
//收集函数
void Collect(int *a, list<int> *li) {
int i = 0;//i初始化为0
list<int>::iterator it;//迭代器
for (int j = 0; j <= 9; j++) {
it = li[j].begin();//it从li的首位置开始
while (it != li[j].end()) {//目的是将li全部都按顺序放到a数组中
a[i] = *it;
i++;
it++;
}
li[j].clear();//使用完将它清理掉,好习惯
}
}
int CalcBit(int num) {//计算数字的位数
int cnt = 0;
while (num / 10 != 0) {
num = num / 10;
cnt++;
}
cnt = cnt + 1;
return cnt;
}
int main() {
int n;
int a[20002];
int maxx;
while (cin >> n) {
maxx = 0;//因为有多组数据,所以需要重新赋值为0,避免干扰
for (int i = 0; i < n; i++) {
cin >> a[i];
maxx = maxx > a[i] ? maxx : a[i];//将最大的数存放在maxx中
}
int c = CalcBit(maxx);//求出最大数的位数为c
list<int> lists[10];
for (int i = 1; i <= c; ++i) {//因为题目没有说明白有多少位数字,所以从1循环到最大位数c
Distribute(a, n, i, lists);
Collect(a, lists);
}
for (int j = 0; j < n; j++) {//输入排序后的结果
cout << a[j] << ' ';
}
}
return 0;
}
新手上路,有错请指正.