欢迎来到天天文库
浏览记录
ID:48124851
大小:89.50 KB
页数:6页
时间:2020-01-21
《实验五(快速、堆、基数)排序算法的设计.doc》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、实验五(快速、堆、基数)排序算法的设计一、实验目的和要求实验目的:1.深刻理解排序的定义和各种排序方法的特点,并能灵活运用。2.掌握常用的排序方法,并掌握用高级语言实现排序算法的方法。3.了解各种方法的排序过程及其依据的原则,并掌握各种排序方法的性能的分析方法。实验要求:要求彻底弄懂排序的物理存储结构,并通过此试验为以后的现实使用打下基础。二、实验内容和原理(1)实验内容:设计快速排序,堆排序和基数排序的算法。(2)实验原理:快速排序:在待排序的n个数据中,任取一个数据为基准,经过一次排序后以基准数据把全部数据分为两部分,所有数值比基准数小的都排在其前面,比它大的都排在其后,
2、然后对这两部分分别重复这样的过程,直到全部到为为止。堆排序:对待排序的n个数据,依它们的值大小按堆的定义排成一个序列,从而输出堆顶的最小值数据(按最小值跟堆排序),然后对剩余的数据再次建堆,便得到次小的,如此反复进行输出和建堆,直到全部排成有序列。基数排序:LSD法:先按最低关键字位k1对待排序数据中的n个值进行排序,按k1值把待排序文件中的n个记录分配到具有不同k1值的若干个堆,然后按k1值从小到大的次序收集在一起,下次再按高一位关键子位k2的值进行分配和收集,如此不断地按更高一位关键字位进行分配和收集,直到用kn分配和收集之后,整个数据按多关键字位有序。堆排序:堆排序分为
3、建堆和堆调整,初始建堆时将与此序列对应的一维数组看成是一棵完全二叉树,从完全二叉树的最后一个结点K(i)(i等于n/2向下取整)开始,通过调整逐步使以K(i)到K(1)为根的子树满足堆的定义,直到以K(1)为根的树满足堆定义时初始堆建成。堆调整在出堆顶记录之后,用堆中的最后一个记录替代原堆顶记录。由于除根节点K(i)之外的所有子树仍具有堆的性质,故只需对根结点自上而下调整即可。三、实验环境硬件:(1)学生用微机(2)多媒体教室或远程教学(3)局域网环境软件:(1)WindowsXP中文操作系统(2)TurboC3.0四、算法描述及实验步骤1)快速排序设两个指示器变量i和j,分
4、别指向待排序区间的第一个记录和最后一个记录;先将第一个记录移到暂存变量temp中,然后j从区间的最后一个记录起向前扫描,直到找到满足R[j]temp.key的记录时,将R[j]移入R[i]中;就这样j自j-1从后向前扫描一次移入一个R[j]于R[i]中,i自i+1从前向后扫描一次移入一个R[i]于R[j]中,反复交替地扫描和移动记录;直到i=j时把temp移入R[i]中(区间中第一个记录应在位置),它把整个待排序区间分割成为两个区间的一个分割排序算法;对于待排序文件R[]利用
5、一个分割区间排序算法时,令s=1和t=n即可完成第一趟排序;由此得到的两个更小的区间R[1,···,i-1]和R[i+1,···,n],继续利用算法dividesreasort分割为更小的4个区间;如此一直进行下去,直到都分割为只有一个记录时排序结束。1)堆排序堆调整是从根结点向下的一个筛选过程;而建初始堆是从最后一个分枝结点开始到根结点结束的多次向下的筛选过程;3)基数排序第1趟分配按最低关键字位进行,改变记录结点的指针值将文件中的所有记录分配到10个队列中;第2趟的分配和收集以及第3趟的分配和收集是分别针对关键字中的十数和百位数进行的,其分配和收集过程与个位数时相同。一、
6、调试过程(一)快速排序1)2)3)(二)堆排序1)2)二、实验结果(一)快速排序(二)堆排序(三)基数排序一、总结从懵懂到懂得,这是通过调试过程所得到的收获;再次回顾了之前所学的单链表结构的建立,堆的建立。从中体会快速排序、堆排序、基数排序算法的思想,如何优化算法是将来需要进一步改善的地方。附录:代码快速排序#include"stdio.h"#defineMaxsize100#definem10voidquicksort(intR[],intn){inti,j,low,high,temp,top=-1;structnode{intlow,high;}st[Maxsize];t
7、op++;st[top].low=0;st[top].high=n-1;while(top>-1){low=st[top].low;high=st[top].high;top--;i=low;j=high;if(lowtemp)j--;if(i
此文档下载收益归作者所有