课程设计报告书9501879.docx

上传人:b****3 文档编号:1758793 上传时间:2022-10-23 格式:DOCX 页数:11 大小:21.41KB
下载 相关 举报
课程设计报告书9501879.docx_第1页
第1页 / 共11页
课程设计报告书9501879.docx_第2页
第2页 / 共11页
课程设计报告书9501879.docx_第3页
第3页 / 共11页
课程设计报告书9501879.docx_第4页
第4页 / 共11页
课程设计报告书9501879.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

课程设计报告书9501879.docx

《课程设计报告书9501879.docx》由会员分享,可在线阅读,更多相关《课程设计报告书9501879.docx(11页珍藏版)》请在冰豆网上搜索。

课程设计报告书9501879.docx

课程设计报告书课程设计报告书9501879(此文档为word格式,下载后您可任意编辑修改!

)课程设计报告课程名称:

数据结构实验报告设计题目:

排序算法实验分析系别:

*专业:

*组别:

*学生姓名:

*起止日期:

2012年5月10日2012年6月22日指导教师:

*承诺书本人郑重声明:

本人所呈交的学术论文,是本人在导师指导下独立进行研究工作所取得的成果。

除文中已经注明引用的内容外,本论文不包括任何其他个人或集体已经发表或撰写过的作品成果。

对本文的研究作出重要贡献的个人和集体,均已在文中以明确的方式标明。

本人完全意识到本声明的法律结果由本人承担。

学生(签名):

2012年5月28日目录一、系统功能和结构1.1程序设计目的1.2需求分析1.3概要设计1.3.1主要数据结构描述1.3.2算法分析及程序流程图1.4任务安排二、程序实现2.1模块详细设计2.2核心代码详细解析三、调试与操作说明3.1问题分析与解决3.2程序演示四、设计体会与总结4.1程序不足及功能扩充4.2设计心得参考文献一、系统功能和结构1.1程序设计目的通过编程实现直接插入排序、直接选择排序、气泡排序、Shell排序、快速排序、堆排序、二路归并排序等7种排序算法。

1.2需求分析1)被排序样本为由计算机产生长度为n的随机整数序列,这里n分别取20,100,5002)程序要实现对排序过程中数据比较和移动次数的统计功能3)对程序运行实际结果进行比较分析1.3概要设计1.3.1主要数据结构描述本项目需要用到的主要数据结构:

简单选择排序for(inti=1;i=jj;i+)RA2i=RA1i;for(i=1;ijj;+i)intj=i;for(intk=i+1;k=jj;k+)if(RA2kRA2j)j=k;if(i!

=j)v=RA2j;RA2j=RA2i;RA2i=v;n+;cout排序后的元素为:

endl;for(i=1;i=jj;i+)coutRA2i;coutendl;cout一共移动次数为:

n;冒泡排序for(inti=1;i1)intIndex=1;for(intj=1;jk;j+)if(RA2j+1RA2j)w=RA2j;RA2j=RA2j+1;RA2j+1=w;Index=j;n+;直接插入排序if(RA2iRA2i-1)RA20=RA2i;复制为哨兵for(intj=i-1;RA20RA2j;-j)RA2j+1=RA2j;记录后移RA2j+1=RA20;插入到正确位置n+;快速排序intpivotloc=Huafen(l,-1个记录中再选出关键码最小的记录与第二个记录交换;如此,第i趟,则从第i个记录开始的n-i+1个记录中选出关键码最小的记录与第i个记录交换,直到整个序列按关键码有序。

【效率分析】空间效率:

仅用了一个辅助单元。

时间效率:

简单选择排序中,所需进行记录移动的操作次数较小,其最小值为0,最大值为3(n-1)。

然而,无论记录的初始排列如何,所需进行的关键字之间的比较次数相同,均为n(n-1)2。

因此,总的时间复杂度也是O(n2)。

2.直接插入排序设有n个记录,存放在数组r中,重新安排记录在数组中的存放顺序,使得按关键码有序。

即r1.keyr2.keyrn.key先来看看向有序表中插入一个记录的方法:

设tj,tk=1;2.按步长序列个数k,对序列进行k趟排序;3.每趟排序,根据对应的步长ti,将待排序列分割成若干长度为m的子序列,分别对各子表进行直接插入排序。

仅步长因子为1时,整个序列作为一个表来处理,表长度即为整个序列的长度。

希尔排序时效分析很难,关键码的比较次数与记录移动次数依赖于步长因子序列的选取,特定情况下可以准确估算出关键码的比较次数和记录的移动次数。

目前还没有人给出选取最好的步长因子序列的方法。

步长因子序列可以有各种取法,有取奇数的,也有取质数的,但需要注意:

步长因子中除1外没有公因子,且最后一个步长因子必须为1。

希尔排序方法是一个不稳定的排序方法。

4.冒泡排序冒泡排序方法:

对n个记录的表,第一趟冒泡得到一个关键码最大的记录rn,第二趟冒泡对n-1个记录的表,再得到一个关键码最大的记录rn-1,如此重复,直到n个记录按关键码有序的表。

【效率分析】空间效率:

仅用了一个辅助单元。

时间效率:

总共要进行n-1趟冒泡,对j个记录的表进行一趟冒泡需要j-1次关键码比较。

移动次数:

最好情况下:

待排序列已有序,不需移动。

5.快速排序快速排序是通过比较关键码、交换记录,以某个记录为界(该记录称为支点),将待排序列分成两部分。

其中,一部分所有记录的关键码大于等于支点记录的关键码,另一部分所有记录的关键码小于支点记录的关键码。

我们将待排序列按关键码以支点记录分成两部分的过程,称为一次划分。

对各部分不断划分,直到整个序列按关键码有序。

【效率分析】空间效率:

快速排序是递归的,每层递归调用时的指针和参数均要用栈来存放,递归调用层次数与上述二叉树的深度一致。

因而,存储开销在理想情况下为O(log2n),即树的高度;在最坏情况下,即二叉树是一个单链,为O(n)。

时间效率:

在n个记录的待排序列中,一次划分需要约n次关键码比较,时效为O(n),若设T(n)为对n个记录的待排序列进行快速排序所需时间。

6.堆排序大概思路:

先把待排序的的记录构造成堆,然后通过从堆中不断选出最小元素,从而达到排序的目的。

为了解决初始建堆问题,可以通过把待排序的文件中的记录逐个插入到空堆中。

这样需要另外开辟与原来文件同样大小的SortObject空间。

为了节省空间,可以利用原始文件的空间,反复调用一个称为sift的函数,从后向前逐步把待排序的记录调整成堆。

程序示意图如下:

1.4任务安排在需求分析和数据流图完成后,分配小组任务如下:

姓名具体任务分配*1.直接选择排序编辑,编译以及快速排序数据输入;2.冒泡排序编辑,编译,以及冒泡排序数据输入;3.堆排序编辑,编译,以及冒泡排序数据输入;4.程序整体编码和译码输出到文本;*1.希尔排序代码编辑,编译以及数据输入;2.快速排序编辑,编译以及数据输入;3.插入排序代码编辑,编译以及数据输入4.调试程序,检查错误并改正;二、程序实现2.1模块详细设计根据上面的流程图,下面分析每个模块具体的功能,包括每个模块的参数和得出的结果选择排序模块:

函数名称voidXuanzePaixu(),入口参数intv,n=0;返回值模块功能选出最小的一个数与第一个位置的数交换;然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止。

冒泡排序模块:

函数名称voidMaopaoPaixu();入口参数intw,n=0;返回值1模块功能自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。

即:

每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。

堆排序模块:

函数名称voidpaixu:

dui入口参数ints,intm返回值1模块功能把待排序的的记录构造成堆,然后通过从堆中不断选出最小元素,从而达到排序的目的直接插入模块:

函数名称voidCharuPaixu()入口参数返回值模块功能快速排序模块:

函数名称voidKuaisuPaixu()入口参数返回值模块功能希尔排序模块:

函数名称voidXierPaixu()入口参数返回值模块功能2.2核心代码解析classpaixupublic:

voidXuanzePaixu();简单选择排序voidMaopaoPaixu();冒泡排序voidCharuPaixu();直接插入排序intHuafen(intl,int=0;for(inti=1;i=jj;i+)RA2i=RA1i;for(i=2;i=jj;+i)if(RA2iRA2i-1)RA20=RA2i;复制为哨兵for(intj=i-1;RA20RA2j;-j)RA2j+1=RA2j;记录后移RA2j+1=RA20;插入到正确位置n+;cout排序后的元素为:

endl;for(i=1;i=jj;i+)coutRA2i;coutendl;cout一共移动次数为:

n;快速排序intpaixu:

Huafen(intl,intl;返回枢轴的位置Huafenvoidpaixu:

KPaixu(intl,int(l,-1趟。

执行n-1趟,但每一趟只比较一次,移动元素两次,总的比较次数是(n-1),移动元素的次数是2(n-1)次。

故最好情况下的时间复杂度就是O(n)。

如果在最坏情况(非递增)下,则最多比较i次,伴随而来的需要的比较次数也会增多。

由以上运行结果可以看出排序算法的稳定性和其时间复杂度。

多次运行结果后发现选择排序为不稳定的排序。

而且还可分析出稳定排序有直接插入排序和冒泡排序,不稳定排序有选择排序,希尔排序和快速排序。

由排序方法的运行结果可知插入、冒泡排序的速度较慢。

当n较小时,对稳定性不作要求时宜用选择排序,对稳定性有要求时宜用插入或冒泡排序。

当n较大时,关键字元素比较随机,对稳定性没要求宜用快速排序。

快速排序是目前基于比较的内部排序法中被认为是最好的方法。

通过比较他们在不同场合的时间复杂度,得知没有哪一种排序方法是绝对最优的。

有的适用于N较大的情况,有的适用于N较小的情况,因此,在实用时需根据不同情况适当选用,甚至可将多种方法结合起来使用。

4.2设计心得在此次课程设计过程中,从确定题目到完成整个编程工作,通过这次课程设计使我们认识到平时光看书上觉得很简单,自己不亲自动手,这些程序设计的思想永远不会真正理解。

只有把所学的理论知识学好,然后多动手与实践相结合起来,才能真正提高自己的实际动手能力和独立思考的能力。

这段时间内我遇到了各种各样的问题,比如在设计的过程中发现了自己的薄弱之处,对一些知识的掌握还很欠缺,比如类的结构,链表等。

由于我们这次课程设计确定的题目是各种内排序性能的比较,这就首先要求我必须掌握各种内排序的原理,并且还要把各个排序之间的特点对比结合起来综合考虑。

在实现排序功能编码和编译过程中还没有遇到太大的问题,但在进行移动次数,比较次数和交换次数的统计中一直无法得出想要的最终正确的结果,最后在请教了其他同学和自己上网看视频,查资料之后一步一步解决了。

我发现在程序写好后,用来测试的数据也很重要,要注意选好数据。

争取多选择几次有代表性的数字。

争取多选择几次有代表性的数字,不然就暴露不了一些问题。

这次课程设计,使我对数据结构有了更进一步的认识和了解,要通过不断的实验巩固才能更好地学习它,同时也暴露出我的许多不足之处,对C+的一些库函数知识点,特点等还不太了解,不能清晰,熟练运用各种常用函数的功能,对函数调用的正确使用不够熟悉,对C+中经常出现的错误也不熟悉。

通过这次课程设计,我更加体会到了实践的重要性。

这次课程设计,通过在网上查阅大量资料、程序代码以及一些学术论文,很好的对内排序算法进行了研究,特别对数据结构这门课所学到的内容付诸于实践,加深了理解。

另外,还学到了一写别的方面的知识。

这次课题设计还有许多没有考虑周到的地方,希望老师指出。

参考文献1张乃孝著.算法与数据结构-C语言描述(第二版)高等教育出版社2谭浩强著.C程序设计(第二版)清华大学出版社3萧秋水,文娟.网络编程之vb篇M.北京.清华出版社。

4方敏,张彤.网络应用程序设计M.安.安电子科技大学出版社。

5黄超.windows下的网络编程M.北京.人民邮电出版社。

6汪祖柱沈晓潞,基于C语言实现的若干排序算法和分析,安徽电气工程职业学院学报,第九卷第一期。

7王莉,常用内部排序算法

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1