基数排序
先按最低有效位进行排序,在下一位排序,以此类推,直到对所有的d位数字都进行了排序,所以对数的排序仅需要进行d 轮。
下图说明了7个3位数的基数排序过程
#include<iostream>
#include<math.h>
using namespace std;
//取相应位置的数字
#define getnum(x,d) ((int)(x/pow(10,d-1))%10)
void show(int *arry,int i){
for(int j=0;j<i;j++)
cout<<arry[j]<<" ";
cout<<endl;
}
void COUNTING_SORT(int *A,int n,int k,int p){
int *C,*B;
C = new int[k];
B = new int[n];
int i;
for(int i=0;i<k;i++)
C[i]=0;
for( i=0;i<n;i++)
C[getnum(A[i],p)]=C[getnum(A[i],p)]+1;
for( i=1;i<k;i++)
C[i]=C[i]+C[i-1];
for(int i=n-1;i>=0;i-- ){
B[C[getnum(A[i],p)]-1]=A[i];
C[getnum(A[i],p)]=C[getnum(A[i],p)] -1;
}
for(i=0;i<n;i++)
A[i]=B[i];
}
void RADIX_SORT(int *arry,int d,int n){
for(int i=1;i<=d;i++){
COUNTING_SORT(arry,n,10,i);
}
}
int main(){
int A[11]={51,2,21,103,11,43,84,67,19,13,12};
show(A,11);
RADIX_SORT(A,3,11);
show(A,11);
return 0;
}
为保证基数排序的正确性,一位数排序算法必须是稳定的。所以可以选择用计数排序来进行排序。
引理:给定n个d位数,其中每一个数位有k个可能的取值。如果RADIX_SORT适 用的稳定排序方法耗时Θ(n+k),那么它就可以再Θ(d(n+k))时间内将这些数排好序。
引理:给定一个b位数和任何正整数r<=b,如果RADIX_SORT使用的稳定排序算法 对数据取值区间是0到k的输入进行排序耗时Θ(n+k),那么它就可以在Θ((b/r)(n+2^r)) 时间内将这些数排好序。