msd基数排序

    技术2022-05-20  29

    //利用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");                  }      


    最新回复(0)