没有合适的资源?快使用搜索试试~ 我知道了~
算法设计与分析汽车牌照课程设计报告
5星 · 超过95%的资源 需积分: 13 15 下载量 201 浏览量
2011-12-06
20:46:00
上传
评论 3
收藏 251KB DOC 举报
温馨提示
试读
17页
此题目主要要求对汽车牌照进行基数排序,和用二分查找的思想进行查找,这两种方法思想并不难,但是要对汽车牌照进行排序和查找,此问题涉及到的主要问题是: 首先的问题就是,用何种存储结构对汽车信息和汽车牌照进行存储汽车牌照,然后汽车牌照不是单单是数字,而且是汉字、字母与数字混合排列的,这就不仅仅对数字进行基数排序了,还要对字母进行相关处理,方可用基数排序的方法进行排序。经过最后查找资料、分析将汉字、字母转化为数字处理,汉字代表汽车牌照的地区,共有34个省市自治区简称,即34个汉字,26个英语大写字母,分别用数组存储这34个汉字和26个大写字母,将他们转化为数字,最后再用基数排序,方可达到题目要求。在二分查找问题中,是对汽车牌进行查找,首先将要查找的汽车牌转换为数字形式,再用二分查找递归算法,找不到返回一个值,找到再返回一个值,再找到这个位置,输出查找的所有信息,即可达到题目要求
资源推荐
资源详情
资源评论
课程设计报告
一. 问题的分析与定义
题目:汽车拍照的排序与查找问题
此题目主要要求对汽车牌照进行基数排序,和用二分查找的思想进行查找,这两
种方法思想并不难,但是要对汽车牌照进行排序和查找,此问题涉及到的主要问题是:
首先的问题就是,用何种存储结构对汽车信息和汽车牌照进行存储汽车牌照,然后汽
车牌照不是单单是数字,而且是汉字、字母与数字混合排列的,这就不仅仅对数字进
行基数排序了,还要对字母进行相关处理,方可用基数排序的方法进行排序。经过最
后查找资料、分析将汉字、字母转化为数字处理,汉字代表汽车牌照的地区,共有 34
个省市自治区简称,即 34 个汉字,26 个英语大写字母,分别用数组存储这 34 个汉字
和 26 个大写字母,将他们转化为数字,最后再用基数排序,方可达到题目要求。在
二分查找问题中,是对汽车牌进行查找,首先将要查找的汽车牌转换为数字形式,再
用二分查找递归算法,找不到返回一个值,找到再返回一个值,再找到这个位置,输
出查找的所有信息,即可达到题目要求。
二.数据结构的选择和概要设计
1.数据结构的选择
对于汽车牌照进行排序和查找,为了使程序尽可能的实用性,我将定义,车主,车
牌号,车色,车型为一个结构类型,用链表的形式存储这些信息,为了方便对汽车牌照进
行排序,在定义一个数组存储将汉字、字母转化后的长数据类型,汉字和字母都用两个字
符来表示。在基数排序中,基数排序每趟的收集由两个链队列收集,链队列的个数为基数
的个数。在二分查找中,是对汽车牌号进行查找,首先将汽车牌号转化为数字,再用递归
算法查找。最后再将所有车辆信息输出,达到题目要求。
2.概要设计
为了实现上述功能,需要的函数及其功能如下:
1).主函数 main()
2)车辆信息录入函数 Setlist()
3)基数每一趟的分配函数 Distribute()
4)基数每一趟的收集函数 Collect()
5)基数排序函数 paixu()
6)二分查找函数 search()
7)输出函数 print()
各函数关系如下:
1
主函数流程图:
Setlist
paixu
sear
ch
print
Dist
ribu
te
Colle
ct
Twsearc
h
2
main
三.详细设计和编码
1.汽车节点类型
结束
n=1
输入 n
n=2
n=3
n=5
调用子函数 SetList(p)
调用子函数 print()
调用子函数 search(p)
调用子函数 paixu(p)
n=4
Y
N
N
Y
Y
Y
Y
N
N
N
N
N
N
N
N
3
开始
typedef struct node{
int keynum[M]; //汽车牌照转换为十进制后的数据
char key[10]; //汽车牌照号
char color[10]; //汽车颜色
char type[10]; //汽车类型
char name[10]; //车主姓名
struct node *next; //指向下一个节点的指针域
}Rnode;
2.基数排序的过程
链式基数排序就是在链式存储结构下通过反复的分配、收集运算来进行排序的。
首先将待排序的记录分成若干个子关键字,排序时,先按最低位的关键字对记录进行
初步排序;在此基础上,再按次低位关键字进一步排序,以此类推,由低位到高位,由此
关键字到主关键字,每一趟排序都在前一趟排序的基础上,直到按最高位关键对记录进行
排序后,基数排序完成。车牌号是由一个汉字、一个大写字母和五个数字组成,由于有 34
个省自治区简称,字母有 26 个,本来基数应该是 34,但这样一来太麻烦,而且不好分析,
故将汉字、字母转换为十进制数再进行基数排序,这样做的好处是,基数都是从 0~9,比
较简便,而且易懂。为了更好的分析此算法,举一个例子:
一组记录的关键字为:83,8,184,505,930,589,63,109,278
采用基数排序方法对其进行排序。
上述这组关键字的值都在 0≦K≦99 的范围内,我们可以把每一个数位上的十进制数字看
成是一个关键字,即将关键字 K 看成由 3 个关键字 K
0
,K
1
,K
2
组成。其中,K
0
是百位上的
数字,K
1
是十位上的数字,K
2
是个位上的数字。因为十进制的基数是 10,所以,每个数位
上的数字都可能是 0~9 中的任何一个。先按关键字 K
2
来分配所有参与排序的元素,将 K
2
=0
的元素放在一组、K
2
=1 的元素放在一组、……、K
2
=9 的元素放在一组。再按 K
2
的值由 0
到 9 的 顺 序 收 集 各 组 元 素 , 形 成 序 列
(930,063,083,184,505,278,008,109,589,269)。
对上述序列中的元素再按关键字 K
1
来分配,也分成 10 组。然后再按 K
1
的值由 0 到 9 的
顺 序 收 集 各 组 元 素 , 形 成 序 列
(505,008,109,930,063,269,278,083,184,589)。
对该序列中的元素再按关键字 K
0
来分配。然后按 K
0
的值由 0 到 9 的顺序收集各组元素,
形成序列(008,063,083,109,184,267,278,505,589,930)。基数排序完成。
分析该例,可以看出基数排序的思想是:首先将待排序的记录分成若干个子关键字,
排序时,先按最低位的关键字对记录进行初步排序;在此基础上,再按次地位关键字进一
步排序。依次类推,由低位到高位,由次关键字到主关键字,每一趟排序都在前一趟排序
的基础上,直到按最高位关键字对记录进行排序后,基数排序完成。
因此,在汽车牌照的基数排序中,首先将汽车牌照的汉字、字母全部转化为十进制数 ,
以便于基数排序。汉字和字母是由两个字符表示,转换好后方可进行基数排序。
接下来就是如何收集各组记录。从上述例子可看出,各组记录的收集遵循“先进入该组
的记录将先被收集”的原则可知,各组序列以列来描述较为精确。因为要进行多次的分配与
收集,为节省存储空间及运算方便,采用链队列来存储各组序列。链队列的数量与基数一
致 , 若 基 数 为 RAX , 则 令 f[0]~f[RAX-1] 分 别 指 向 RAX 个 链 队 列 的 队 头 节 点 , 令
r[0]~r[RAX-1]分别指向 RAX 个队列的队尾节点。每次分配前,将 RAX 个链队列置空,即
for(i=0;i<RAX-1;i++)
f[i]=r[i]=NULL;
4
剩余16页未读,继续阅读
资源评论
- linuejie2013-05-29文档很好很详细,推荐给大家!
zzfwg
- 粉丝: 1
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功