#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 //利用链表的存储结构 //从按照个位排序开始 个位相同的属于一个链表 //再拿出来 实现排序