数据结构课程设计报告内部排序的算法设计与分析.docx
《数据结构课程设计报告内部排序的算法设计与分析.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计报告内部排序的算法设计与分析.docx(31页珍藏版)》请在沃文网上搜索。
1、题目 常用内部排序算法分析与比较 专业、班级计算机科学与技术10-02班 学号 姓名 主要内容:分析直接插入排序、希尔排序、冒泡排序、快速排序、简单选择排序、堆排序、归并排序、基数排序等常用的内部排序算法的思想,通过交换次数以及比较次数来对这些算法进行比较。基本要求:通过给定的记录数目及排序思想,设计相应的存储结构,程序之中要求可以实现完全随机,部分逆序等测试数据,来对每一种排序算法进行验证。其次还要设计出一个统计交换次数和比较次数的函数来进行计数。从待排序的记录数目、记录大小、关键字结构及其对稳定性的要求讨论出每种算法使用的环境。主要参考资料:严蔚敏 吴伟民 数据结构(C语言版) 清华大学出
2、版社完 成 期 限: 2012/6/21 指导教师签名: 课程负责人签名: 2012年 6月 21 日一、设计题目:常用的内部排序的算法分析和比较二、运行环境:操作系统:Windows软件:Visual C+ 6.0 三、设计目的:针对常见的计算机内部排序算法,如直接插入排序、希尔排序、冒泡排序、简单选择排序、堆排序、归并排序、基数排序等,通过是自己设计的程序,借助排序中交换次数和比较次数来比较这些算法的适用范围。四、程序设计的流程图:用户使用的提示性界面4 程序退出2 用户自行输入数据3全部逆序的随机数1完全随机数的操作八种内部排序的各个操作显示操作之后八种算法的比较五、算法分析:1、简单选
3、择排序:简单选择排序的每一趟都是从待排的数据元素中选出一个最小(最大)的一个元素,顺序的放在已经排好的数列的最后,直到全部待排序的数据元素排序完毕。2、直接插入排序:这是一种最简单的排序方法,它的基本操作时将一个记录插入到一个已经排好序的有序表中,从而得到一个新的记录数增1的有序表。其效率:从空间的角度来看待,它只需要一个辅助的空间,从时间上来看的话,排序的基本操作是比较两个关键字的大小和移动(本程序中将移动和交换看成一样)记录。在整个排序的过程中,当待排序列中的关键字非递减有序的话,那么比较次数最小n-1,且不需要移动,当待排序列逆序时,比较次数达到最大(n+2)(n-1)/2,记录的移动的
4、次数也达到最大值(n+4)(n-1)/2。取平均值得时候直接插入排序的时间复杂度O(n)。排序是稳定的。3、冒泡排序:这种排序的比较基本思想就是两两比较待排序的数据元素的大小,发现两个数据元素的次序相反时候,就进行交换,知道没有反序的数据为止。冒泡排序是一次的比较找出最小(最大)值,然后将其放置序列的最后一个位置,再将剩下的从第一个位置开始至n-i的位置进行重复的操作。4、希尔排序:属于一种插入排序类的方法,先将整个待排序记录分成若干个子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对整体记录进行一次直接插入排序。实质上就是一个将序列分块化,然后再对各个块进行排序,化整为零的操
5、作,最后待序列差不多有序的时候进行一次化零为整操作,实现最后一次的插入排序。5、快速选择排序:这个是对冒泡排序的一种改进。它的基本思想就是,在当前无序区R1.H中任取一个数据元素作为比较的基准(不妨记为X),用此基准将当前无序区划分为左右两个较小的无序区:R1.I-1和RI+1.H,且左边的无序子区中数据元素均小于等于基准元素,右边的无序子区中数据元素均大于等于基准元素,而基准X则位于最终排序的位置上,即R1.I-1X.KeyRI+1.H(1IH),当R1.I-1和RI+1.H均非空时,分别对它们进行上述的划分过程,直至所有无序子区中的数据元素均已排序为止。6、堆排序:堆排序实质上就是具备有如
6、下性质的完全二叉树:树中任一非叶子结点的关键字均大于等于其孩子结点的关键字。它只需要记录一个大小的辅助空间,每个待排序的纪录仅占有一个存储空间。一般对记录数较少的文件并不值得提倡,但是对n较大的文件还是很有效的,因为其运行时间主要是小号在建初始堆和调整建新堆时进行的反复的筛选上的。7、归并排序:归并排序实质上就是将两个或者两个以上的有序表组合成一个新的有序表。8、基数排序:基数排序是一种借助多关键字排序思想对单逻辑关键字进行的排序方法。中间是涉及到一个重复的分配再收集的操作。具体在本程序中:根据数项个位上的值,将所有的数据项分为10组;然后对这10组数据重新排列,把所有的以0结尾的排在最前,当
7、然需要保证稳定性,然后依次类推以2、39开头,接着进行第二趟的排序,由于本程序中用到的数字是1000以内的实例,那么需要有第三趟的操作,最后就是收集,收集完输出的时候是将一个关键字按照百位十位个位一次输出的。9、排序算法的时间空间复杂度:排序方法最坏情况平均情况稳定性空间复杂简单选择O(n)O(n)不稳定O(1)直接插入O(n)O(n)稳定O(1)冒 泡O(n)O(nlogn)稳定O(1)希尔排序-O(n1.3)不稳定O(1)快速选择O(nlogn)O(n)不稳定O(nlogn)堆排序O(nlogn)O(nlogn)不稳定O(1)归并排序O(nlogn)O(nlogn)不稳定O(n)基数排序O
8、(d(n+rd)O(d(n+rd)稳定O(rd)六、程序调试:1、本程序实例使用的是visual C+ 6.0开发,运行本程序之后出现人机交互的界面如下所示:2、选择的是第一步操作之后对程序进行随机数据的操作,本次输入的是随机生成23个数据,运行之后会出现相应的系统给出的原来的随机数,以及运行排序之后的全部数据,在此之后给出了各个排序表的比较次数和交换次数的表格,以便于对各个排序的方法得到分析性能:要求系统产生23个数据,随机数据为:2、564、194、809、585、480、351、896、823、747、175、859、711、514、304、15、92、365、148、166、989、4
9、46、120如下图所示3、进行第二步操作,用户自行的输入一些数据来对各个算法进行性能的测试:用户输入的测试数据12个,数据为:887、44、556、525、4、666、78、91、05、125、58、643运行之后的界面如下所示:4、执行第三步操作,系统生成随机的逆序的一组数据:要求系统随机产生34个数据:随机的逆序数据是:989、896、859、823、809、747、711、664、608、602、585、572、564、532、514、480、451、446、378、365、353、351、304、194、175、167、166、148、120、92、15、9、5、25、为了确保系统测试
10、的稳定性,本系统中提供的一组数据保证在50个以内,下面是用户要求系统输出50个以上时候系统给出反应6、程序的安全退出:一些说明,本程序的健壮性还不是很好,比如说在人机交互的主界面以及数据的录入的时候,用户需要小心的正确输入阿拉伯数字。七、个人收获心得:本次课程设计是在最后一次的实验基础之上,即最后一段时间的学习数据结构(C语言版)中的内部排序算法的基础上,通过对各个内部排序的算法的分析,比较,然后再运行在系统上面。计算机算法的设计不是一个小的功夫就能够满足的,在这次的课程设计中,自己可以能够深入的了解到每一个排序的每一步具体的操作,真正的领悟每一个算法本质的排序思想,为自己以后的计算机学习奠定
11、了坚实的基础。当然本次的课程设计,在最初的算法写作的时候并没有遇到什么较为复杂的错误,后续的程序界面搭建时候,由于忽略掉了全局变量被修改的这一个现象,使得自己花了一些功夫在调试程序。问题不麻烦,相对来说,这种错误真的是常见的但却也是最应该避免的错误,但愿这一次的错误,可以为自己的后期学习中添砖加瓦。本次所选的课程题目是关于内部排序的算法分析与比较,计算机内部排序的算法也不仅仅是在本程序中调试的那八种排序,当然除了内部排序还有外部的排序,在一个内部排序的时候,自己花的这些功夫,随只是勉强的实现了功能,但是计算机的算法还是很深,需要自己引起足够的重视。想成为一名好的计算机编程员,代码的重复需要自己
12、下很大的功夫。计算机语言的学习,计算机算法的衍生可谓都是博大精深,必须要施之与论持久战的方法,化整为零,溶入希尔算法的缩小增量的思想,定会到达一个“基本有序”的地步,最终实现一步合零位整一步插入,相信计算机可以走得持久。最后,对传授自己数据结构知识的卢冰卢老师说一声谢谢!八、附录(本程序的源代码及其注释):#include#include#include#define MAXSIZE 50typedef int KeyType;#define MAXNUM 100typedef structKeyType key;RedType;RedType RMAXNUM;/定义结构体数组typedef
13、structRedType rMAXSIZE+1;/r0闲置、或者用作哨兵单元int length;Sqlist;/顺序表的类型Sqlist L,L0,L1,L2,L3,L4,L5,L6,L7;typedef Sqlist HeadType;#define RADIX 10/关键字的基数#define MAX 8/关键字项数的最大值#define MAX_SPACE 10000typedef int KeysType;typedef structKeysType keysMAX;/关键字int next;SLCell;/静态链表的节点类型typedef struct SLCell rlMAX_
14、SPACE; /静态链表的可利用空间 int keynum; /记录当前的关键字个数 int recnum; /静态链表的当前长度SLList;/静态链表的类型typedef int ArrTypeRADIX;int compare8;/用来记录比较的次数int change8;/用来比较交换的次数 void shuRu(Sqlist &L)/数据录入顺序表int i=1,n;printf(请输入你输入的数据个数 : n);scanf(%d,&n);printf(请依次的输入各个数据值n);L.length = n;for(;i=L.length;i+)scanf(%d,&L.ri);void
15、 shuChu(Sqlist &L)/输出顺序表中的元素int i=1;printf(该顺序存储中的数据元素为:);for(;iL.length;i+)printf(%d ,L.ri);printf(%dnn,L.ri);/=简单选择排序=int SelectMinKey(Sqlist &L,int i)/在L.ri到length中找到最小值的记录int k;compare0 += L.length-i;for(k=i;i=L.length;i+)compare0+;/记录的是i与length的比较compare0+;/下面的选择语句中的比较if(L.ri.keyL.rk.key)k=i;ch
16、ange0+;return k;void SelectSort(Sqlist &L)/顺序表的简单选择排序操作int i,j,temp;for(i=1;iL.length;+i)compare0+;/记录的是i与length的比较j = SelectMinKey(L,i);compare0+;if(i!=j)temp=L.ri.key;L.ri.key=L.rj.key;L.rj.key=temp;change0+=3;/交换次数加3/=直接插入排序=void inserSort(Sqlist &L)/直接插入排序int j;for(int i = 2 ; i=L.length; +i) co
- 1.请仔细阅读文档,确保文档完整性,对于不预览、不比对内容而直接下载带来的问题本站不予受理。
- 2.下载的文档,不会出现我们的网址水印。
- 3、该文档所得收入(下载+内容+预览)归上传者、原创作者;如果您是本文档原作者,请点此认领!既往收益都归您。
下载文档到电脑,查找使用更方便
20 积分
下载 | 加入VIP,下载更划算! |
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 报告 内部 排序 算法 设计 分析
