简介:
数字有几位就排序几次
10进制10个队列,16进制16个队列
使用时适用条件:适用空间换取时间时
缺点:使用10个队列,对于物理空间的要求更高
代码实现:
第一步:分发,按照个位数字,放到编号从0~9的10个队列中
void distribute(vector<int>& num, queue<int>digitQue[], int power)
{
int i;
for (i = 0; i < num.size(); i++)
{
digitQue[(num[i] / power) % 10].push(num[i]);
}
}
第二步:收集,利用队列先进先出的特点,从0~9收集10个队列中的数据,进行第一次排序
void collect(vector<int>& num, queue<int>digitQue[])
{
int j = 0, i = 0;
for (; j < 10; j++)
{
while (!digitQue[j].empty())
{
num[i++] = digitQue[j].front();
digitQue[j].pop();
}
}
}
第三步:循环,转移到下一位重复上面的步骤继续排序
for (i = 0; i <circle; i++)
{
distribute(num, digitQue, power);
collect(num,digitQue);
power *= 10;
}
主函数调用实现:(完整代码)
#include<iostream>
using namespace std;
#include<vector>
#include<queue>
#include<iomanip>
void radixSort(vector<int>& num,int circle);
void printVector(vector<int>& num);
void distribute(vector<int>& num, queue<int>digitQue[],int power);
void collect(vector<int>& num, queue<int>digitQue[]);
int main()
{
vector<int>num;
int i;
for (i = 0; i < 10; i++)
{
num.push_back(rand()%100);
}
radixSort(num,2);//待排序的数字最大是2位数
printVector(num);
}
void radixSort(vector<int>& num,int circle)
{
int i;
int power = 1;
queue<int>digitQue[10];
for (i = 0; i <circle; i++)
{
distribute(num, digitQue, power);
collect(num,digitQue);
power *= 10;
}
}
void distribute(vector<int>& num, queue<int>digitQue[], int power)
{
int i;
for (i = 0; i < num.size(); i++)
{
digitQue[(num[i] / power) % 10].push(num[i]);
}
}
void collect(vector<int>& num, queue<int>digitQue[])
{
int j = 0, i = 0;
for (; j < 10; j++)
{
while (!digitQue[j].empty())
{
num[i++] = digitQue[j].front();
digitQue[j].pop();
}
}
}
void printVector(vector<int>& num)
{
int i;
for (i = 0; i < num.size(); i++)
{
cout << setw(4) << num[i];
if ((i + 1) % 5 == 0)
cout << endl;
}
}
结果