C++基数排序

#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


//利用链表的存储结构

//从按照个位排序开始  个位相同的属于一个链表
//再拿出来  实现排序
原文地址:https://www.cnblogs.com/libin123/p/10420144.html