基数排序分为MSD法与LSD法,以下是LSD法:
基数排序是第二种桶排序的拓展:
LSD是以低优先位先排,高优先位后排的顺序形成正确结果。比如扑克牌的花色优先数字次之,就先排好数字,再排花色,即为所求。
#include<iostream>
#include<vector>
using namespace std;
struct player {
int id;
int num;
};
void radixsort(vector<player> &a) {
vector<player> buc[10]; //这次的桶不光是计数了,所以用向量存放,0~9准备10个向量
for (int i = 0; i < a.size(); i++) { //散列入桶,按个位排序
buc[a[i].num%10].push_back(a[i]);
}
a.clear(); //清空准备回收
for (int i = 0; i < 10;i++) {
for (auto& e : buc[i])a.push_back(e); //回收
buc[i].clear();
}
for (int i = 0; i < a.size(); i++) { //再次散列入桶,按十位排序
buc[a[i].num / 10%10].push_back(a[i]);
}