一,基数排序的思想
基数排序不比较关键字的大小,它是根据关键字中各位的值,对待排序的n个元素进行若干趟的"分配"与"收集"来实现排序。
二,基数排序算法实现
/**
*
* 基数排序
*
* r:表示基数,例如:如果待排的元素是十进制 r = 10,
* d:关键字的位数,例如:待排序的序列是{123, 34, 45, 3456}, 此时d = 4
* 如果待排序的序列是{123, 34, 6}, 此时 d = 3;
*
*/
void RadixSort(vector<int> &nums, int r, int d){
vector<vector<int> > qu;
vector<int> first(r);
vector<int> last(r);
for(int i = 0; i < r; i ++){
first[i] = 0;
last[i] = 0;
}
for(int i = 0; i < 10; i ++){
vector<int> temp(nums.size());
qu.push_back(temp);
}
int k = 0;
while(k < d){
//分配
for(int i = 0; i < nums.size(); i ++){
//取出关键字nums[i],在第k位上的数字
int v = (int)(nums[i] / pow(r, k)) % r;
qu[v][last[v]] = nums[i];
//尾指针指向的位置,是下一个要进队的元素放置的位置
last[v] ++;
}
//收集
int j = 0;
for(int i = 0; i < r; i ++){
while(first[i] != last[i]){
nums[j ++] = qu[i][first[i]];
first[i] ++;
}
first[i] = 0;
last[i] = 0;
}
k ++;
}
}