- 1、本文档共16页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
算法与数据结构课程设计
~ PAGE 3 ~
xx大学
课 程 设 计 实 践 报 告
学 院:计算机与信息工程学院
课程名称: 算法与数据结构
任课教师: xxx
班 级: xx班
学 号: xxx
姓 名: xxx
同组学生:
实践地点: xx大学
实践时间:2010年8月19日至2010年9月3日
实验题目:汽车牌照的快速查找
实验要求:
利用链式基数排序和折半查找对一批汽车牌照进行排序和查找
问题分析:
想要完成题目要求,需要选择链表对汽车信息(包括汽车牌照、汽车颜色、汽车商标、汽车的注册时间、汽车所有者等)进行存储,并在此基础上进行多关键字排序,因为汽车牌号是汉字、字母和数字的组合。考虑到对汉字进行排序是一件不可能的事,因此对各省市的简称可以放到字符串数组中,也就可以通过数组下标进行排序,字母可以选择同汉字一样的处理方法,数字却很容易进行排序。因此,排好序的汽车牌照其实就是一组长整型数组,例如根据行政规划对各省市的简称进行存储,如汽车牌照京C0123,转换为长整型数组后如何对排好序的车辆信息进行折半查找呢?因为存储好的汽车信息其实就是一组长整型数组,而所输入的信息就是一个长整型数据,然后再那个数组中进行折半查找既可以实现。
设计思路及流程:
为了完成所需的功能,需要的函数及其功能如下:
main():主函数模块
SetList():添加车辆函数
Distribute():进行基数排序每一趟的分配函数
Collect():进行基数排序每一趟的收集函数
find():二分查找函数
menu():主函数显示菜单模块
print():输出所有车辆信息函数
paixu():基数排序函数
以下为各函数流程图
主函数流程图: 汽车信息函数SetList(p)流程图:
开始结束
开始
结束
n=t
输入n
n=c
n=q
调用子函数SetList(p)
调用子函数print()
调用子函数find(p)
n=s
Y
N
N
Y
Y
Y
N
N
N
N
N
N
开始
结束
申请一结点p并为其分配内存空间。
head=NULL
head=p
输入汽车的相应信息,经过相应的处理后存入结点p相应的域。
将该结点按尾插法插入到链表的相应位置
返回该链表的头指针
Y
N
排序子函数paixu(p)的流程图 : 查找子函数find(p)的流程图
开始结束
开始
结束
i=M-1
i=0
调用Distribute及Collect函数
i++
遍历排序好的链表将每个车辆的牌照号转换为长整型数据存于一个一维数组A[MAX]中。
Y
N
开始
结束
输入需要查找的牌照
将待查找的牌照号处理后存于一整型变量中
调用折半查找函数并返回c
c=-1
没有查找成功
查找成功并输出该车的信息
Y
N
详细算法思想:
1、基数排序的过程:
首先将待排序的记录分成若干个子关键字,排序时,先按最低位的关键字对记录进行初步排序;在此基础上,再按次低位关键字进一步排序,以此类推,由低位到高位,由此关键字到主关键字,每一趟排序都在前一趟排序的基础上,直到按最高位关键对记录进行排序后,基数排序完成。
在基数排序中,基数是各个关键只的取值范围。若待排序的记录是十进制,则基数是10;若待排序的记录是由若干个字母组成的单词,则基数为26,也就是说,从最右边的字母开始对记录进行排序,每次排序都将待排序记录分成26组,但在此问题中,车牌号是由汉字,字母以及数字组成,若直接进行排序,则需要分成34组,为了提高算法的空间性能,可以将汉字及字母转换为十进制数后再进行基数排序。
例如:一组记录的关键字为:(278,109,63,930,589,184,505,269,8,83)
可以看出,这组关键字与以前说过的用来排序的关键字并无差别,且也是针对但关键字对一组记录进行排序。但在基数排序中,我们可以将单关键字看成由若干个关键字复合而成。
上述这组关键字的值都在0~999的范围内,我们可以把一个数位上的十进制数字看成是一个关键字,即将关键字K看成由3个关键K0,K1,K2组成。其中,K0是百位上的数字,K1是十位上的数字,K2是个位上的数字。
因为十进制的基数是10,所以,每个苏伟山的数字都可能是0~9中的任何一个。我们先将关键字K2来分配所有参与排序的元素,将K2=0的元素防在一组、K2=1的元素放在一组、 ……、K2=9的元素放在一组。这样,将上述一组元素分成10组,如下(a)图所示。然后,再将K2的值由0到9的顺序收集各组元素,形成序列(930,063,08
文档评论(0)