• 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
    
    
    //利用链表的存储结构
    
    //从按照个位排序开始  个位相同的属于一个链表
    //再拿出来  实现排序
  • 相关阅读:
    K好数
    蓝桥杯 安慰奶牛
    蓝桥杯 节点选择
    模拟链表
    10588
    八数码的 八种境界
    HIT 2051
    概率DP
    数组越界溢出
    FATFS在SD卡里,写入多行数据出的问题
  • 原文地址:https://www.cnblogs.com/libin123/p/10420144.html
Copyright © 2020-2023  润新知