基数排序是基于分配和收集来进行的,而通常内部排序是基于比较进行的,这一点需要注意。基数排序里涉及到多次的除法和模运算,因此基数排序是的执行时间较长。这里使用STL中的queue来作为桶,不需要单独去实现队列。
代码语言:javascript复制#include <queue>
#include <iostream>
#include <algorithm>
using namespace std;
//这里选择基数位10 对10进制的数字进行基数排序
//获取10进制数的第i位 i从0开始
/*
比如987, 第0位为7, 第一位为8, 第二位为9
*/
int getBit(int x, int i) {
while(i --) x /= 10;
return x %= 10;
}
//基数排序要求数组中的每一个数字的位数相同 d表示位数
void radixSort(int *a, int n, int d) {
queue<int> q[10];//10进制数需要10个桶
//d位的数字需要进行 d趟的收集与分配
for(int i=0; i<d; i) {
//分配
for(int j=0; j<n; j) q[getBit(a[j], i)].push(a[j]);
//收集
for(int j=0, k=0; j<10; j) {
while(! q[j].empty()) {
a[k ] = q[j].front(); q[j].pop();
}
}
}
}
int main() {
int a[] = {33, 44, 11, 88, 22, 77, 99, 66, 55};
int n = sizeof a/sizeof(int);
radixSort(a, n, 2);
for_each(a, a n, [](int a){cout << a << " ";});
return 0;
}
执行结果: