算法导论之基数排序 例子的简单实现:对7个三位数的排序,中间用到计数排序,每次排序获得位置的index,然后再重排数组a。其中数组copya用于获得数组a中的每一位。
#include <iostream>
using namespace std;
void CountSort(int a[],int index[],int n,int k);
void RadixSort(int a[],int n,int m);
int main()
{
int a[] = {329,457,657,839,436,720,355};
for(int i=0 ; i<7 ; i++){
cout << a[i] << " ";
}
cout << endl;
RadixSort(a,7,9);
for(int i=0 ; i<7 ; i++){
cout << a[i] << " ";
}
cout << endl;
return 0;
}
//a[]输入待排序数组,n为数组中元素的个数,m为每位的取值最大值,此处为9
//输出a[]为修改后的数组
void RadixSort(int a[],int n,int m)
{
int temp[n];
int copya[n];
int copyaa[n];
int index[n+1];//用数组标识位置的变化
int aa[n];
for(int i=0; i<n ; i++){
copya[i] = a[i];
aa[i] = a[i];
}
for(int i=0 ; i<3 ; i++){
for(int j=0; j<n ; j++){
temp[j] = copya[j] % 10;
copya[j] = copya[j] / 10;
copyaa[j] = copya[j];
}
CountSort(temp,index,n,m);
for(int j=0 ; j<n ; j++){
copya[j] = copyaa[index[j+1]];//note 下标从1开始取值
a[j] = aa[index[j+1]];
}
for(int j=0 ; j<n ; j++){
aa[j] = a[j];
}
cout << "round" << i+1 << ": ";
for(int j=0 ; j<n ; j++){
cout << a[j] << " ";
}
cout << endl;
}
}
void CountSort(int a[],int index[],int n,int k)
{
int c[k+1];
for(int i=0 ; i<=k ; i++){
c[i] = 0;
}
for(int i=0 ; i<n ; i++){//统计a[n]中取值为0,1...k的个数,c[i]表示a[n]中满足a[j]=i的个数
c[a[i]] += 1;
}
for(int i=1 ; i<=k ; i++){//c[i]表示a[n]中满足a[j]≤=i的个数
c[i] += c[i-1];
}
for(int i=n-1 ; i>=0 ; i--){//note:从大到小遍历以保证稳定性
index[c[a[i]]] = i;//note!!!!
c[a[i]] --;
}
}