#include<iostream>
#include<list>
using namespace std;
int maxdigit(int data[],int n)//求所有数中最大的数是几位数
{
int d=1;
int p=10;
for(int i=0;i<n;i++)
{
while(data[i]>=p)
{
p*=10;
++d;
}
}
return d;
}
void radixsort(int data[],int n)//基数排序
{
int digits=maxdigit(data,n);
list<int> lists[10]; //创建链表数组
int d,j,k,factor;
for(d=1,factor=1;d<=digits;d++,factor*=10) //三轮循环 因为最大为百位 个十百
{
for(j=0;j<n;j++) //将数组中的数按照个/十/百位放到对应的链表里
{
lists[(data[j]/factor)%10].push_back(data[j]);
}
for(j=k=0;j<10;j++) //将链表里的数依次放到数组中
{
while(!lists[j].empty())
{
data[k++]=lists[j].front();
lists[j].pop_front();
}
} //完成了按照个/十/百位的排序
for(int i=0;i<9;i++) //输出中间结果
cout<<data[i]<<"->";
cout<<data[9]<<endl;
}
}
int main()
{
int data[10]={179,208,306,93,859,984,55,9,271,33};
radixsort(data,10);
for(int i=0;i<9;i++)
cout<<data[i]<<"->";
cout<<data[9]<<endl;
//system("pause");
return 0;
}
//效率比较高 但是需要多一倍的存储空间
//拿最大的为百位的数来讲
//先按个位的大小将所有数进行排序 个位相同的放在一起 为一堆/桶
//再按十位的大小将所有数进行排序 十位相同的放在一起
//最后按百位的大小将所有数进行排序 百位相同的放在一起 排序完即为正确的顺序
//先从个位开始->十位->百位 叫做LSD 最低位优先
//反之叫MSD
//利用链表的存储结构
//从按照个位排序开始 个位相同的属于一个链表
//再拿出来 实现排序