zoukankan      html  css  js  c++  java
  • 基数排序(也叫桶子排序)

    基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用,基数排序法是属于稳定性的排序,其时间复杂度为O (nlog(r)m),其中r为所采取的基数,而m为堆数,在某些时候,基数排序法的效率高于其它的稳定性排序法。

    基本解法

    第一步

    以LSD为例,假设原来有一串数值如下所示:
    73, 22, 93, 43, 55, 14, 28, 65, 39, 81
    首先根据个位数的数值,在走访数值时将它们分配至编号0到9的桶子中:
    0
    1 81
    2 22
    3 73 93 43
    4 14
    5 55 65
    6
    7
    8 28
    9 39

    第二步

    接下来将这些桶子中的数值重新串接起来,成为以下的数列:
    81, 22, 73, 93, 43, 14, 55, 65, 28, 39
    接着再进行一次分配,这次是根据十位数来分配:
    0
    1 14
    2 22 28
    3 39
    4 43
    5 55
    6 65
    7 73
    8 81
    9 93

    第三步

    接下来将这些桶子中的数值重新串接起来,成为以下的数列:
    14, 22, 28, 39, 43, 55, 65, 73, 81, 93
    这时候整个数列已经排序完毕;如果排序的对象有三位数以上,则持续进行以上的动作直至最高位数为止。
    LSD的基数排序适用于位数小的数列,如果位数多的话,使用MSD的效率会比较好。MSD的方式与LSD相反,是由高位数为基底开始进行分配,但在分配之后并不马上合并回一个数组中,而是在每个“桶子”中建立“子桶”,将每个桶子中的数值按照下一数位的值分配到“子桶”中。在进行完最低位数的分配后再合并回单一的数组中。
     下面看代码:
    #include<iostream>
    #include<string>
    #include<cmath>
    #include<cstring>
    using namespace std;
    const int maxn=100+5;
    const int maxm=100+5;
    int a[]={2, 343, 342, 1, 123, 43, 4343, 433, 687, 654, 3};
    int Size;
    int Find_max()
    {
        int ma=-1;
        for(int i=0;i<Size;i++)
        {
            ma=max(ma,a[i]);
        }
        return ma;
    }
    int Find_bit(int n)
    {
        int cnt=0;
        while(n)
        {
            cnt++;
            n/=10;
        }
        return cnt;
    }
    void sort1(int bit)
    {
        int Buckets[maxn][maxm];//0-9  和位数
        memset(Buckets,0,sizeof(Buckets));
        for(int i=0;i<Size;i++)
        {
            int p=a[i]/pow(10,bit);
            p=p%10;//得到那一位
            for(int j=0;j<maxm;j++)
            {
                if(Buckets[p][j]==0)
                {
                    Buckets[p][j]=a[i];
                    break;
                }
            }
        }
    
        //已经放入桶中
        //现在重新放入数组中
        int cnt=0;
        for(int i=0;i<10;i++)
        {
            for(int j=0;j<maxm;j++)
            {
                if(Buckets[i][j]==0) break;
                a[cnt++]=Buckets[i][j];
            }
        }
        return ;
    }
    void solve(int bit)
    {
        for(int i=0;i<bit;i++)
        {
            sort1(i);//i=0比较的是个位
        }
        return ;
    }
    int main()
    {
    
        Size=sizeof(a)/sizeof(int);
        int ma=Find_max();//找到最大的数
        int bit=Find_bit(ma);//找到最大的位数
        solve(bit);
        for(int i=0;i<Size;i++) cout<<a[i]<<" ";
        cout<<endl;
        return 0;
    }
    当初的梦想实现了吗,事到如今只好放弃吗~
  • 相关阅读:
    一元多项式乘法
    将博客搬至CSDN
    Tomcat的几种部署方式
    Visual Studio 2012以后无法保存只读文件的问题
    WPF中的Generic.xaml, theme以及custom control
    WPF的页面导航
    WPF MVVM系列文章
    tomcat中同时部署两个项目的问题
    Windows多线程系列
    XML DTD和XML Schema
  • 原文地址:https://www.cnblogs.com/caijiaming/p/10539567.html
Copyright © 2011-2022 走看看