本文将介绍基数排序算法的基本思想,并附上C++和Python实现的源代码。
- 基数排序的基本思想:
我是这样理解基数的:任何多位数都是有个位、十位、百位。。。构成的,那么其中的个位、十位、百位等的数字就可称为该数据的基数。从而,我们可以依次根据基数的大小来判断数据的大小。比如:先判断数据的个位数,将它们按个位数从大到小依次排列起来,然后依次比较十位数,依次类推,直至比较完数据的所有位数。 - 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)