#include<stdio.h>//A为排序前的数组,n为A长度,B为排序后数组,k为【0,k】之间的数排序void counting_sort(int A[], int n, int B[], int k);void print(int B[], int n);//基数排序d为位数void radix_sort(int A[], int n, int d);//返回num中第n位的数(从右往左)int digit_of_num(int num,int n);//对A的第d位进行稳定排序(基于计数排序)void stable_sort(int A[], int n, int d);int main(int argc, char *argv[]){ int a[]={0,2,5,3,0,2,3,0,3}; int b[10]; counting_sort(a,8,b,5); print(b,8); int A[]={0,329,457,657,839,436,720,355,11}; radix_sort(A,8,3); print(A,8); return 0;}void radix_sort(int A[], int n, int d){ int i; for(i=1;i<=d;++i) stable_sort(A,n,i); }void stable_sort(int A[], int n, int d){ int i,j; int a[50]={0}; int b[50]={0};//记录排序后的A int c[10]={0};//按d位排序后的下标 for(i=1;i<=n;++i) a[i]=digit_of_num(A[i],d); for(j=1;j<=n;++j) c[a[j]]+=1; for(i=1;i<=10;++i) c[i]+=c[i-1]; for(j=n;j>=0;--j){ b[c[a[j]]]=A[j]; c[a[j]]-=1; } for(i=1;i<=n;++i) A[i]=b[i];}int digit_of_num(int num,int n){ int i; for(i=1;i<=n-1;++i) num/=10; return num%10;}void counting_sort(int A[], int n, int B[], int k){ int i,j; int c[10]={0}; for(j=1;j<=n;++j) c[A[j]]+=1; for(i=1;i<=k;++i) c[i]+=c[i-1]; for(j=n;j>=0;--j){ B[c[A[j]]]=A[j]; c[A[j]]-=1; }}void print(int B[], int n){ int i=0; for(i=1;i<=n;++i) printf("%d ",B[i]); printf("\n");}