#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <stack>//不能用栈,先进后出,会影响排序结果
#include <queue>
using namespace std;
/*基数排序:对数字范围比较大的排序时间复杂度较小
每次排序:利用箱子排序:对数字范围较小的排序时复杂度小
*/
int main()
{
//箱子排序基数设置为10
//确定最大的数字的位数(多少次箱子排序)
//取每一位进行箱子排序
int counts = 5;//最大数的位数
int numsCount = 1000;//数字总个数
int allNums[1000] = {0};
int mod;//每一位数字
queue<int> nums[10];//箱子排序统计
//造数据
srand((unsigned)time(NULL));
for(int i = 0; i < numsCount; i++)
{
allNums[i] = rand() % 100000;
cout << allNums[i] << '\t';
}
cout << endl;
cout << endl;
cout << endl;
for(int i = 0; i < counts; i++)
{
//每次取最低位排序
for(int j = 0; j < numsCount; j++)
{
switch(i)
{
case 0: mod = allNums[j] % 10;//取最低位
break;
case 1: mod = allNums[j] % 100 / 10;//取次低位
break;
case 2: mod = allNums[j] % 1000 / 100;
break;
case 3: mod = allNums[j] % 10000 / 1000;
break;
case 4: mod = allNums[j] % 100000 / 10000;
break;
default:break;
}
nums[mod].push(allNums[j]);//放入箱子相对位置
}
int index = 0;
for(int k = 0; k < 10; k++)
{
while(!nums[k].empty())
{
allNums[index++] = nums[k].front();//从箱子取出改变原数组的顺序,要按顺序,先进先出
nums[k].pop();
}
}
}
for(int i = 0; i < numsCount; i++)
{
cout << allNums[i] << '\t';
}
return 0;
}