基数排序是一种非比较型排序算法。它是通过依次对一个数的每一位来排序,最终来达到排序的目的。
比如数:73,22,93,43,55,14,28,65,39,81
对最低位排序后为:81,22,73,93,14,55,65,28,39
再对十位排序后:14 22 28 39 43 55 65 73 81 91
假设要排序的数中最大的数有d位,那么排序方法为
RADIX-SORT(A, d)
for i←1 to d
do use a stable sort to sort array A on digit i
算法导论中讲到的“stable sort”的做法是“箱子”,10进制数要有10个箱子,放进去时,从下往上,依次来放,取出来时,从底往上依次来取。
#include<iostream>
#include <vector>
using namespace std;
void RADIX_SORT(int A[], int d)
{
//A,存放数的数组,d数组中最大数的位数
int MaxW=1;
for(int i=1;i<d;i++)
MaxW=MaxW*10;
vector<vector<int>> Tmp(10);//用做箱
int n=1,lsd,k=0;//n,数组中,数的最大位数,lsd数的某一位大小,
while (n<=MaxW)
{
for (int i=0;i<d;i++)
{
lsd=(A[i]/n)%10;//求某一位数
Tmp[lsd].push_back(A[i]);
}
for (int i=0;i<10;i++)
{
if (!Tmp[i].empty())
{
for (vector<int>::iterator iter=Tmp[i].begin();iter!=Tmp[i].end();iter++)
{
A[k]=*iter;
k++;
}
Tmp[i].clear();//清空
}
}
n=n*10;
k=0;
}
}
int main()
{
int A[10]={73,22,93,43,55,14,28,65,39,81};
RADIX_SORT(A, 2);
for(int i=0;i<10;i++)
cout<<A[i]<<" ";
}