用数组实现基数排序
lsd式——从位数小的开始比较
msd式——从位数高的开始比较
例子:
lsd式从右边开始比较,属于分配式排序,时间复杂度是O(nlogm),每次从右边位开始比较一直到最高位,适合位数小的数比较,总共比较最高位数趟。
-
算法
首先找出数组中的最大元素确定最高位数,然后根据有效位数排序直到最高位数,排序即完成。 -
步骤:
#include<iostream>
void LsdSort(int a[],int length); //使用lsd——基数比较法给数组排序
int main(void){
int a[]={934,88,654,256,756,89,85,1,6,99,1024};
int length=sizeof(a)/sizeof(a[0]); //计算数组长度
LsdSort(a,length);
return 0;
}
void LsdSort(int a[],int length){
using namespace std;
int max=a[0],digit=0,i=0,j,k=0,n=1,lsd;
//digit计算最高位位数,n用来进行每次进十,lsd是进行比较的有效位数
while(i<length){ //找出最大元素
if(max<a[i])
max=a[i];
i++;
}
while(max){ //计算最高位数
digit++;
max/=10;
}
cout<<"排序前:"<<endl;
for(i=0;i<length;i++)cout<<a[i]<<" ";
cout<<endl;
int temp[10][length]={0},order[10]={0};
//创建一个中间变量数组temp,和一个储存每个位数上元素的个数的数组order
for(int s=0;s<digit;s++){ //循环最高位数次
for(i=0;i<length;i++){ //根据每次比较的有效位数将数组a的元素储存到对应的“桶”里面
lsd=(a[i]/n)%10; //每次比较中数组a的每个元素的有效位数
temp[lsd][order[lsd]]=a[i];
order[lsd]++; //使得下一次储存对应位数到下一个单元
}
cout<<"重新排序后:"<<endl;
for(i=0;i<10;i++){ //排序过的数组覆盖原数组
if(order[i]!=0){
for(j=0;j<order[i];j++){
a[k]=temp[i][j];
cout<<a[k]<<" ";
k++;
}
}
order[i]=0; //每次使用后要将order[i]置零,以免下次比较储存单元错误
}
k=0;
n*=10; //lsd=(a[i]/n)%10;使有效位数每次进十
cout<<endl;
}
cout<<"排序后:"<<endl;
for(i=0;i<length;i++) cout<<a[i]<<" ";
}