项目 4 - 英文单词的基数排序

来源:互联网 发布:我的世界枪械js怎么用 编辑:程序博客网 时间:2024/04/30 09:22

/* 


*Copyright (c) 2016,烟台大学计算机学院 
*All right reserved.  
  
*文件名称:test.cpp  
  
*作者:杨天瑞  
  
*完成日期:2016年12月20日  
  
*版本号:v1.8.8
   
*  
  
*  问题描述:设计一个基数排序的算法,将一组英文单词,按字典顺序排列。假设单词均由小写字母或空格构成,最长的单词有MaxLen个字母。
             


*  程序输入:无。
  
*  程序输出:单词排序结果。  
  

*/


#include <stdio.h>#include <malloc.h>#include <string.h>#define MaxLen 9                //单词的最大长度#define Radix  27               //基数rd为27,分别对应' ','a',…'z'typedef char String[MaxLen+1];  //定义String为字符数组类型typedef struct node{    String word;    struct node *next;} LinkNode;void DispWord(String R[],int n) //输出单词{    int i;    printf("  ");    for (i=0; i<n; i++)        printf("[%s] ",R[i]);    printf("\n");}void PreProcess(String R[],int n)//对单词进行预处理,用空格填充尾部至MaxLen长{    int i,j;    for (i=0; i<n; i++)    {        if (strlen(R[i])<MaxLen)        {            for (j=strlen(R[i]); j<MaxLen; j++)                R[i][j]=' ';            R[i][j]='\0';        }    }}void EndProcess(String R[],int n)//恢复处理,删除预处理时填充的尾部空格{    int i,j;    for (i=0; i<n; i++)    {        for (j=MaxLen-1; R[i][j]==' '; j--);        R[i][j+1]='\0';    }}void Distribute(String R[],LinkNode *head[],LinkNode *tail[],int j,int n)//按关键字的第j个分量进行分配,进入此过程时各队列一定为空{    int i,k;    LinkNode *p;    for (i=0; i<n; i++)         //依次扫描R[i],将其入队    {        if (R[i][j]==' ')       //空格时放入0号队列中,'a'时放入1号队列中,…            k=0;        else            k=R[i][j]-'a'+1;        p=(LinkNode *)malloc(sizeof(LinkNode)); //创建新结点        strcpy(p->word,R[i]);        p->next=NULL;        if (head[k]==NULL)        {            head[k]=p;            tail[k]=p;        }        else        {            tail[k]->next=p;            tail[k]=p;        }    }}void Collect(String R[],LinkNode *head[])//依次将各非空队列中的记录收集起来{    int k=0,i;    LinkNode *p;    for (i=0; i<Radix; i++)        for (p=head[i]; p!=NULL; p=p->next)            strcpy(R[k++],p->word);}void RadixSort(String R[],int n)    //对R[0..n-1]进行基数排序{    LinkNode *head[Radix],*tail[Radix]; //定义Radix个队列    int i,j;    for (i=MaxLen-1; i>=0; i--)             //从低位到高位做d趟箱排序    {        for (j=0; j<Radix; j++)            head[j]=tail[j]=NULL;           //队列置空        Distribute(R,head,tail,i,n);        //第i趟分配        Collect(R,head);                    //第i趟收集    }}int main(){    int n=6;    String R[]= {"while","if","if else","do while","for","case"};    printf("排序前:\n");    DispWord(R,n);    PreProcess(R,n);    printf("预处理后:\n");    DispWord(R,n);    RadixSort(R,n);    printf("排序结果:\n");    DispWord(R,n);    EndProcess(R,n);    printf("最终结果:\n");    DispWord(R,n);    printf("\n");    return 0;}

运行截图;



0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 未来婆婆给我买衣服我不喜欢怎么办 孩子调皮被同学排斥不想上学怎么办 宝宝出生没人带怎么办自己要上班 孩子上幼儿园一年了还哭怎么办 6年级孩子会认字不会写怎么办 小孩写字没兴趣爱玩玩具怎么办 小学二年级语文记不住生字怎么办 2周半宝宝不肯马桶拉臭臭怎么办 娃晚上不肯睡早上不肯起怎么办 小学一年纪学生做作业粗心怎么办 考完试的题本偷撕了一页怎么办 犯错把父母惹的很生气该怎么办 一年级孩子做题粗心不认真怎么办 作弊被老师发现怎么办抄错了卷子 孩子最近老是被老师罚抄课文怎么办 孩子总是撒谎说作业作完了怎么办 孩子严重挑食怎么办一点菜也不吃 孩子在家很听话在学校很调皮怎么办 没通过交警车主全责不垫付怎么办 开车撞伤人交警说车主全责怎么办 面对喜欢上网又判逆的儿子怎么办 五年级了计算题老是出错怎么办 三年级的孩子老是计算题出错怎么办 写在表上的字写错了怎么办不能涂改 我的孩子做作业很马虎怎么办 幼儿园老师把学生名字写错怎么办 孩子的手写字磨了疙瘩怎么办 我家孩子上一年级算题特慢怎么办 脚注太多导致与正文距离太大怎么办 搜狗输入法打字不显示选字框怎么办 粘贴文字时带自动添加了序号怎么办 电脑上是表字打印出来是坔怎么办 不同颜色的衣服一起洗染色了怎么办 两岁宝宝不爱吃饭怎么办且消瘦 一岁两个月宝宝不爱吃饭怎么办 罗汉鱼头座大颜色不红怎么办 为什么孩子的牙都是龋齿怎么办呀 蓝迪儿童墙膜出现气泡了怎么办 空sd卡或文件系统不受支持怎么办 8个月宝宝吃了纸怎么办 宝宝出生两天了不吃不喝怎么办