//利用msd计数排序对变长字符串进行排序 #include<stdlib.h>#include<stdio.h>#define RA 27 /*基数*/#define dia(a,b) ((a[b])?a[b]-'a'+1:0) /*将字母转化成数字(0~25)*/#define bin(a) (l+cnt[a])/*取得第a个箱子的元素个数*/char *aux[256]; /*全局数组*//** MSDSort_A: 基数排序*a : 字符串数组,为char*[]类型*w :当前位*cl : 每个元素的长度*l~r : 所要排序的空间 */void MSDSort_A(char* a[],int l,int r,int w){ int i; int cnt[RA+1]={0}; /*计数箱子*/ if(l>=r) return ; /*使用索引计数排序的方法进行划分*/ for(i=l;i<=r;i++) cnt[dia(a[i],w)+1]++; for(i=1;i<=RA;i++) cnt[i]+=cnt[i-1]; for(i=l;i<=r;i++) aux[l+cnt[dia(a[i],w)]++]=a[i]; for(i=l;i<=r;i++) a[i]=aux[i]; if(cnt[0]==(r-l+1)) return; //递归对每个箱子进行划分,第一个箱子单独循环,其余通过循环 MSDSort_A(a,l,bin(0)-1,w+1); for(i=0;i<RA-1;i++) MSDSort_A(a,bin(i),bin(i+1)-1,w+1); } /*测试======================================================================== *dev c++ */int main(){ int N; printf("请输入要排序的字符串的个数:"); scanf("%d",&N); const int k=N; char* a[k]; char storage[k][256]; for(int i=0;i<N;i++) { a[i]=storage[i]; scanf("%s",a[i]); } MSDSort_A(a,0,N-1,0); for(int i=0;i<N;i++) printf("%s ",a[i]); system("pause"); }