具体的原理可以参考这篇文章:
http://www.cnblogs.com/Braveliu/archive/2013/01/21/2870201.html
代码实现:
#include <iostream>
#include <list>
using namespace std;
int maxdixgit(int data[],int n) //返回数有几位
{
int d=1; //基数的位数
int p=10; //开始设值为10,然后进行比较
for(int i=0;i<n;++i) //循环进行比较查看几位数
{
while(data[i]>=p) //查看数是不是比10要大
{
p*=10; //如果比10大,p的值*10
++d; //d的位数加1
}
}
return d;
}
void radixSort(int data[],int n) //基数排序
{
list<int> p[10];
int s,j,i,x;
int digit=maxdixgit(data,n); //先返回数有几位
for( i=0,x=1;i<digit;x*=10,++i) //进行几次取出,排序
{
for( j=0;j<n;j++) //遍历所有的数,将数放在链表中
{
//设一个数为n,则在C语言中其个位、十位、百位、千位依次这样计算:n/1%10,n/10%10,n/100%10,n/1000%10
p[(data[j]/x)%10].push_back(data[j]); //把数据放入链表中,x就是数取整的位
}
for( s=j=0;j<10;j++) //将链表中的数取出来放入数组中
{
while(!p[j].empty()) //如果链表有数据
{
data[s++]=p[j].front(); //将数据放入数组中
p[j].pop_front(); //删除链表中的数据
}
}
for(int m=0;m<n;m++) //查看中间结果
cout<<data[m]<<' ';
cout<<endl;
}
}
int main()
{
int a[10]={10,45,13,5,9,789,485,659,785,1023};
radixSort(a,10);
for(int i=0;i<10;i++)
{
cout<<a[i]<<' ';
}
cout<<endl;
// cout << "Hello world!" << endl;
return 0;
}