排序算法C++&&Python实现---基数排序

本文将介绍基数排序算法的基本思想,并附上C++和Python实现的源代码。
  1. 基数排序的基本思想:
    我是这样理解基数的:任何多位数都是有个位、十位、百位。。。构成的,那么其中的个位、十位、百位等的数字就可称为该数据的基数。从而,我们可以依次根据基数的大小来判断数据的大小。比如:先判断数据的个位数,将它们按个位数从大到小依次排列起来,然后依次比较十位数,依次类推,直至比较完数据的所有位数。
  2. C++实现:
//打印排序结果函数
void Print(int a[],int n,int i=0)
{
    //cout<<i<<endl;
    cout<<"排序后的结果为:"<<endl;
    for(int i=0;i<n;i++)
        cout<<a[i]<<" ";
    cout<<endl;
}
//基数排序
int maxbit(int a[],int n)        //求待排序数组中数据最大位数
{
    int d=0,maxValue=a[0];
    for(int i=1;i<n;i++)
    {
        if(a[i]>maxValue)
            maxValue=a[i];
    }
    while(maxValue>0)
    {
        maxValue/=10;
        d++;
    }
    return d;
}
void radixSort(int a[],int n)
{
    //d为待排序数列中所有数据的最大位数
    //radix为取位数参数,m为当前取的数据位数,如第一位(个位)、第二位(十位)等
    int d=maxbit(a,n),radix=1,m=1;  
    int tmp[9];               //中间数组
    int count[10];            //0-9十个数字的个数
    while(m<=d)
    {
        for(int i=0;i<10;i++)
            count[i]=0;        //每次排序前将桶清零
        for(int i=0;i<n;i++)
        {
            int k=(a[i]/radix)%10;
            count[k]++;                   //统计第k个桶中的数据个数
        }
        for(int i=1;i<10;i++)
            count[i]=count[i-1]+count[i]; //统计在count[i]之前所有的数据个数
        for(int j=n-1;j>=0;j--)
        {
            int s=(a[j]/radix)%10;
            tmp[count[s]-1]=a[j];   //将待排序数据放入正确位置
            count[s]--;             //剔除已放置位置
        }
        for(int i=0;i<n;i++)
        {
            a[i]=tmp[i];           //对排完的数组继续排序
        }
        radix*=10;                 //取下一位数据
        m++;                       //位数加1
    }
    Print(a,n);
}

3.Python实现:

'''输出排序结果函数'''
def Print(ddata):
    n=len(ddata)
    for i in range(n):
        print ddata[i],    #其中","为了不让其输出默认的换行符

'''基数排序'''
def maxRadix(data,n):        #获取数据最大位数
    d=0
    maxValue=max(data)
    while(maxValue>0):
        maxValue=maxValue/10
        d+=1
    return d
def RadixSort(data,n):
    d=maxRadix(data,n)
    RadData=zeros(n)
    rad=1                          #位标志,个位为1,十位为10。。。
    i=1                            #数据位数标志
    while(i<=d):                   #循环d次
        count=zeros(10)            #每个桶中数据个数,每次循环开始清零
        for j in range(n):
            k=(data[j]/rad)%10
            count[k]+=1            #统计个数
        for m in range(1,10):
            count[m]+=count[m-1]   #计算相应位数据个数
        for l in range(n)[::-1]:
            kk=(data[l]/rad)%10
            RadData[count[kk]-1]=data[l]
            count[kk]-=1
        for ii in range(n):
            data[ii]=int(RadData[ii])
        rad*=10
        i+=1
    Print(data)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值