#include<iostream>
#include<cmath>
using namespace std;
/* 三趟排序的变化
930 63 83 184 505 278 8 109 589 269
505 8 109 930 63 269 278 83 184 589
8 63 83 109 184 269 278 505 589 930
*/
//时间复杂度 O(d(n+r_d)) d为关键字的位数
int a[10] = { 278,109,63,930,589,184,505,269,8,83 };
int queue[10][10]; //例: queue[0][2]代表桶0内的第三个数字
void RadixSort(int n) //传递的参数为最高位为几位
{
int front[10];
int rear[10];
memset(front, 0, sizeof(int) * 10);
memset(rear, 0, sizeof(int) * 10);
int m = 0;
while (m<n)
{
for (int i = 0; i < 10; i++)
{
int temp = a[i] / pow(10,m); //pow(10,m)代表10的m次方
temp = temp % 10; //temp第一趟代表的是个位的数字,第二趟是十位的数字,类推...
queue[temp][rear[temp]] = a[i]; // rear[temp]代表temp所对应的队列front rear索引
rear[temp]++;
}//此处for循环结束 queue[10][10]里就保存了a[10]里的所有数
int index = 0;
//最后再依次赋值给a数组
for (int i = 0; i < 10; i++)
while (front[i] != rear[i])
{
a[index++] = queue[i][front[i]];
front[i]++;
}
/* 测试输出
for (int i = 0; i < 10; i++)
cout << a[i] << " ";
cout << endl;
*/
//每循环依次后都要初始化10个队列 以及对应的front rear
for (int i = 0; i < 10; i++)
for (int j = 0; j < 10; j++)
queue[i][j] = 0;
memset(front, 0, sizeof(int) * 10);
memset(rear, 0, sizeof(int) * 10);
m++;
}
}
int main()
{
RadixSort(3);
system("pause");
}