数据结构源码笔记(C语言):英文单词按字典序排序的基数排序

//实现英文单词按字典序排序的基数排序算法

#include<stdio.h>
#include<malloc.h>
#include<string.h>

#define MaxLen 9  //单词的最大长度
#define Radix 27//基数Radix为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--)//从低位到高位排序
	{
		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);	
	return 0;
}

数据结构源码笔记(C语言描述)汇总:

数据结构源码笔记(C语言):英文单词按字典序排序的基数排序

数据结构源码笔记(C语言):直接插入排序

数据结构源码笔记(C语言):直接选择排序

数据结构源码笔记(C语言):置换-选择算法

数据结构源码笔记(C语言):Huffman树字符编码

数据结构源码笔记(C语言):Josephus问题之顺序表

数据结构源码笔记(C语言):Josephus问题之循环链接表

数据结构源码笔记(C语言):多项式合并

数据结构源码笔记(C语言):二叉树之叶子结点旋转销毁

数据结构源码笔记(C语言):哈夫曼树

数据结构源码笔记(C语言):集合的位向量表示

数据结构源码笔记(C语言):链接队列

数据结构源码笔记(C语言):链接栈

数据结构源码笔记(C语言):线性表的单链表示

数据结构源码笔记(C语言):线性表的顺序表示

数据结构源码笔记(C语言):栈的基本操作

数据结构源码笔记(C语言):中缀表达式

数据结构源码笔记(C语言):希尔插入排序

数据结构源码笔记(C语言):索引文件建立和查找

数据结构源码笔记(C语言):冒泡排序

数据结构源码笔记(C语言):快速排序

数据结构源码笔记(C语言):可变长度字符串的快速排序

数据结构源码笔记(C语言):基数排序

数据结构源码笔记(C语言):二路归并排序

数据结构源码笔记(C语言):堆排序

数据结构源码笔记(C语言):二叉树搜索树Kruskal

数据结构源码笔记(C语言):二叉搜索树Prim

数据结构源码笔记(C语言):最短路径弗洛伊德算法

数据结构源码笔记(C语言):深度、广度优先生成树

数据结构源码笔记(C语言):邻接矩阵转化邻接表

数据结构源码笔记(C语言):统计字符串中出现的字符及其次数

数据结构源码笔记(C语言):顺序查找

数据结构源码笔记(C语言):哈希表的相关运算算法

数据结构源码笔记(C语言):分块法查找

数据结构源码笔记(C语言):二分查找

数据结构源码笔记(C语言):二叉树遍历

数据结构源码笔记(C语言):二叉平衡树的相关操作算法

数据结构源码笔记(C语言):二叉排序树的基本操作算法

数据结构源码笔记(C语言):B树的相关运算算法

  • 2
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

半个冯博士

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值