ImageVerifierCode 换一换
格式:DOCX , 页数:33 ,大小:588.56KB ,
资源ID:25053136      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/25053136.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(数据结构 内部排序算法比较.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

数据结构 内部排序算法比较.docx

1、数据结构 内部排序算法比较内部排序算法比较目录摘 要 11绪论 12系统分析 12.1 功能需求 12.2数据需求 12.3 性能需求 23总体设计 23.1系统设计方案 23.2功能模块设计 24详细设计 34.1 数据结构定义 34.2伪随机产生数据模块 44.3简单选择排序模块 64.4起泡排序模块 74.5直接插入排序模块 84.6希尔排序模块 94.7快速排序模块 104.8归并排序模块 114.9条形图模块 125调试与测试 135.1 调试 135.2 测试 136结论 14结束语 14参考文献 15附录1用户手册 16附录2源程序 181绪论随着科技的快速发展,越来越多的企业不

2、再浪费人力财力去计算一些统计性结果,而是应用一些简单的程序或系统来完成这些任务。随着学习数据结构课程的深入,了解了不同排序算法的不同排序方法,每种排序对数据的比较次数、移动次数和排序用时都是不同的,本程序实现了六种内部排序算法的比较,并用条形图直观的显示出各种算法的优劣。运用伪随机产生的数据,调用六种排序算法,记录其比较次数、移动次数和排序时间,再分别用条形图(星号表示)表示出来。2系统分析2.1 功能需求(1)对起泡排序、直接插入排序、简单选择排序、快速排序、希尔排序、归并排序算法进行比较。(2)待排序的元素的关键字为整数,其中数据要用伪随机产生程序产生,并且至少用5组的输入数据做比较,再使

3、用各种算法对其进行排序,记录其排序时间,再汇总比较。(3)演示程序以人机对话的形式进行,每次测试完毕显示各种比较指标值,比较次数、移动次数和排序时间的列表,并用条形图即星号表示出来,以便比较各种排序的优劣。2.2数据需求抽象数据类型:线性表、排序算法 (1) 输入数据:需要比较的数据数目(2) 输出数据:不同算法的比较次数、移动次数、排序时间的数据以及对应的条形图。2.3 性能需求在运行本程序时,只要按照正确的操作方法不会出现无法运行的情况,系统稳定性好,安全,可靠,响应速度由需比较的数字数目多少来决定。 3总体设计3.1系统设计方案 (1) 输入要排序的数据数目 (2) 抽象数据类型定义ty

4、pedef struct int key; ElemType; /关键字typedef struct ElemType *elem; int length;SqList;/分配顺序存储结构 (3) 存储结构:本程序采用了线性表的顺序存储结构。 (4) 算法设计:简单选择排序:运用顺序表。时间复杂度O(n2),空间复杂度O(1)。起泡排序:时间复杂度O(n2),空间复杂度O(1)直接插入排序:时间复杂度O(n2),空间复杂度O(1)希尔排序:时间复杂度O(n1.3),空间复杂度O(1)快速排序:时间复杂度O(nlog2n),空间复杂度O(nlog2n)归并排序:时间复杂度O(nlog2n),空间

5、复杂度O(n)3.2功能模块设计根据分析整个程序主要划分为8个功能模块,分别执行要求中的功能。1个产生伪随机数据模块、6个内部排序算法模块以及1个形成条形图模块。功能模块图如图1所示图1功能模块图(1)伪随机产生数据模块:本程序要求数据是要用伪随机产生程序产生,再用不同排序算法进行排序。(2)简单选择排序模块:运用简单选择排序法对伪随机产生的数据进行排序。(3) 起泡排序模块:运用起泡排序法对伪随机产生的数据进行排序。(4)直接插入排序模块:运用直接插入排序法对伪随机产生的数据进行排序。(5)希尔排序模块:运用希尔排序法对伪随机产生的数据进行排序。(6)快速排序:运用快速排序法对伪随机产生的数

6、据进行排序。(7)归并排序:运用归并排序法对伪随机产生的数据进行排序。(8)条形图表示比较结果:统计6种排序算法的比较结果,用条形图表示出来。 4详细设计4.1 数据结构定义typedef struct int key; ElemType; /关键字typedef struct ElemType *elem; int length;SqList;/分配顺序存储结构4.2伪随机产生数据模块伪随机产生数据模块可实现伪随机产生不同数目的数据以供排序,运用顺序存储结构来实现的。该模块具体实现程序流程如图2所示。 图2 伪随机产生数据模块4.3简单选择排序模块简单选择排序模块可实现用简单排序法对产生的数

7、据进行排序。该模块具体实现程序流程如图3所示。图3 简单选择模块4.4起泡排序模块起泡排序模块可实现运用起泡排序法对数据进行排序,该模块具体实现程序流程如图4所示。 图4 起泡排序模块4.5直接插入排序模块直接插入排序模块可实现运用直接插入排序法对数据进行排序,该模块具体实现程序流程如图5所示。 图5 直接插入排序模块4.6希尔排序模块希尔排序模块可实现运用希尔排序法对数据进行排序,该模块具体实现程序流程如图6所示。 图6 希尔排序模块4.7快速排序模块快速排序模块可实现用快速排序法对数据进行排序,该模块具体实现程序流程如图7所示。图7 快速排序模块4.8归并排序模块归并排序模块可实现用归并排

8、序法对数据进行排序,该模块具体实现程序流程如图8所示。 图8 归并排序模块4.9条形图模块条形图模块可用星号显示出各种算法排序的比较结果,该模块具体实现程序流程如图9所示。图9 条形图模块5调试与测试5.1 调试调试过程主要是运行编制好的程序,然后遇到错误后根据系统的提示,找到相关的问题所在。本系统调试过程中遇到的主要问题、原因和解决方法如下面介绍。(1)问题:用条形图表示时,不能根据数据而表示出星号的多少。解决办法:选择要表示的数据最小的一种排序作为基数,每种排序所要比较的数据可运用数学运算计算出是基数的多少倍,从而输出几个星号。(2)问题:输入数据数目为2个时程序运行错误。原因:待比较的数

9、据为2个时,作为基数的那种排序的数据为0,不能做分母,所以会出现运行错误。解决方法:输入较大的数,使要用条形图表示出来的数据不为0即可。5.2测试软件测试是软件生存期中的一个重要阶段,是软件质量保证的关键步骤从用户的角度来看,普遍希望通过软件测试暴露软件中隐藏的错误和缺陷,所以软件测试应该是“为了发现错误而执行程序的过程”。或者说,软件测试应该根据软件开发各阶段的规格说明和程序的内部结构而精心设计一批测试用例(即输入数据及其预期的输出结果),并利用这些测试用例去运行程序,以发现程序错误或缺陷。过度测试则会浪费许多宝贵的资源。到测试后期,即使找到了错误,然而付出了过高的代价。测试数据过程如下。

10、(1) 输入功能测试输入数据1:100预期结果:输出各排序算法的比较次数、移动次数和排序用时,随后输出数据比较所对应的条形图。运行结果:输出各排序算法的比较次数、移动次数和排序用时,随后输出数据比较所对应的条形图。说明:预期和运行结果相同。输入数据2:25000预期结果:输出各排序算法的比较次数、移动次数和排序用时,随后输出数据比较所对应的条形图。运行结果:超出范围重新输入!说明:不能输入比25000大的数。(2)输出功能测试输入数据1:200预期结果:输出各排序算法的比较次数、移动次数和排序用时,随后输出数据比较所对应的条形图。运行结果:输出各排序算法的比较次数、移动次数和排序用时,随后输出

11、数据比较所对应的条形图。说明:预期和运行结果相同。输入数据2:4预期结果:输出各排序算法的比较次数、移动次数和排序用时,随后输出数据比较所对应的条形图。运行结果:在输出移动次数比较的条形图时出现运行错误。说明:不能输入比5小的数。6结论经过这一段时间的程序设计,该课设任务书中题目所要求的功能也都一一实现。可以伪随机产生不同的数据,六种内部排序算法对其数据进行排序,记录比较次数、移动次数和排序用时,并用条形图直观的表示出不同算法的优劣。不过本程序还可以添加细节,例如:可输出个选择排序方法的菜单,挑选不同排序方法对数据进行比较,也可以再循环选择并用条形图表示出来。结束语为期两个星期的课程设计终于顺

12、利完成,这段时间让我对数据结构这门课程有更多的了解和认识,同时也从编程中所遇到的挫折和困难中吸取更多有价值的经验。编程需要耐心和信心,要有缜密的心思来全面考虑问题,否则编出的程序不能完全满足题目要求或运行错误。通过这次课设,我更深入了解了六种内部排序算法的排序方法和时间复杂度,从而还算顺利的完成了本次课程设计。编程的道路不好走,不过我会更加努力的学习,让编程不再那么困难辛苦,让以后自己能有信心的轻松面对。参考文献1 谭浩强.C语言程序设计(第三版).清华大学出版社,20072 姜灵芝,余健.C语言课程设计案例精编.清华大学出版社,20083 吴伟民,严蔚敏.数据结构. 清华大学出版社,2008

13、4 吕映芝.编译原理.清华大学出版社,2008附录1用户手册点击运行,首先出现的是要输入伪随机产生数据的数目,如图9所示。图9 输入界面输入数据个数然后回车,可显示出不同排序算法的比较次数、移动次数和排序用时。如图10所示。图10 显示比较结果界面显示比较次数的条形图。如图11所示。图11 比较次数条形图界面显示移动次数条形图。如图12所示图12 移动次数条形图界面显示排序用时条形图。如图13所示图13 排序用时条形图界面附录2源程序 主要模块源代码清单:#include#include#include#include#include#define LIST_INIT_SIZE 30000in

14、t bj1,yd1,n,com,mov;long int A5,B5;double t0,t1,t2,t3,t4,t5,C5;clock_t start_t,end_t;typedef struct int key; ElemType;typedef struct ElemType *elem; int length;SqList;void addlist(SqList &L) int i;a: printf(请输入你要输入的个数:); scanf(%d,&n); if(n20000) printf(超出范围重新输入!n); goto a; L.elem=(ElemType*)malloc(L

15、IST_INIT_SIZE*sizeof(ElemType); if(!L.elem)exit(0); L.length=0; for(i=1;i20000)goto b; +L.length; void SelectSort(SqList &L) /简单选择排序 start_t=clock(); int i,j,k,com=0,mov=0; for(i=1;iL.length;i+) k=i; for(j=i+1;jL.length;j+) com+; if(L.elemj.keyL.elemk.key)k=j; if(i!=k) L.elem0.key=L.elemi.key; L.ele

16、mi.key=L.elemk.key; L.elemk.key=L.elem0.key; mov+=3; end_t=clock(); printf(比较次数为 %d移动次数为 %dn,com,mov); t0=(double)(end_t-start_t)/CLK_TCK; printf(排序用时为 %fn,t0); A0=com; B0=mov; C0=t0;void bubblesort(SqList &L) /起泡排序 start_t=clock(); int i=1,j,com=0,mov=0; while(iL.length) for(j=1;jL.elemj+1.key) L.e

17、lem0.key=L.elemj.key; L.elemj.key=L.elemj+1.key; L.elemj+1.key=L.elem0.key; mov+=3; i+; end_t=clock(); printf(比较次数为 %d移动次数为 %dn,com,mov); t1=(double)(end_t-start_t)/CLK_TCK; printf(排序用时为 %fn,t1); A1=com; B1=mov; C1=t1;void InsertSort(SqList &L) /直接插入排序 start_t=clock(); int i,j,com=0,mov=0; for(i=2;i

18、=L.length;i+) if(L.elemi.keyL.elemi-1.key) L.elem0.key=L.elemi.key; mov+; j=i-1; com+; while(L.elem0.keyL.elemj.key) L.elemj+1.key=L.elemj.key; j-; mov+; com+; L.elemj+1.key=L.elem0.key; mov+; end_t=clock(); printf(比较次数为 %d移动次数为 %dn,com,mov); t2=(double)(end_t-start_t)/CLK_TCK; printf(排序用时为 %fn,t2);

19、 A2=com; B2=mov; C2=t2;void xier(SqList &L) /希尔排序 start_t=clock(); int i,d=L.length/2,j,w=0,k,com=0,mov=0; while(wd) w=1; for(i=w;iL.length;i=i+d) k=i; for(j=i+d;jL.elemj.key) k=j; com+; if(i!=k) L.elem0.key=L.elemi.key; L.elemi.key=L.elemk.key; L.elemk.key=L.elem0.key; mov+=3; w+; d=d/2; w=1; end_t

20、=clock(); printf(比较次数为 %d移动次数为 %dn,com,mov); t3=(double)(end_t-start_t)/CLK_TCK; printf(排序用时为 %fn,t3); A3=com; B3=mov; C3=t3;void BeforeSort() yd1=0,bj1=0;void display(int m,int n) printf(比较次数为 %d移动次数为 %dn,m,n);int Partition(SqList L,int low,int high) /快速排序 int pivotkey; L.elem0=L.elemlow; yd1+; piv

21、otkey=L.elemlow.key; while (lowhigh) yd1+; while(low=pivotkey) -high; L.elemlow=L.elemhigh; bj1+; yd1+; while (lowhigh&L.elemlow.key=pivotkey) +low; L.elemhigh=L.elemlow; bj1+; yd1+; L.elemlow=L.elem0; yd1+; return low;void QSort(SqList &L,int low,int high) int pivotloc; if(lowhigh) pivotloc=Partiti

22、on(L,low,high); QSort(L,low,pivotloc-1); QSort(L,pivotloc+1,high); void QuickSort(SqList &L) start_t=clock(); BeforeSort(); QSort(L,1,L.length); display(bj1,yd1); end_t=clock(); t4=(double)(end_t-start_t)/CLK_TCK; printf(排序用时为 %fn,t4); A4=bj1; B4=yd1; C4=t4;void Merge(ElemType R,ElemType R1,int low,

23、int m,int high) /归并排序 int i=low, j=m+1, k=low; while(i=m&j=high) if(Ri.key=Rj.key) bj1+; R1k=Ri; yd1+; i+; k+; else bj1+; R1k=Rj; yd1+; j+; k+; while(i=m) R1k=Ri; yd1+; i+; k+; while(j=high) R1k=Rj; yd1+; j+; k+; void MergePass(ElemType R,ElemType R1,int length, int n) int i=0,j; while(i+2*length-1n

24、) Merge(R,R1,i,i+length-1,i+2*length-1); i=i+2*length; if(i+length-1n-1) Merge(R,R1,i,i+length-1,n-1); else for(j=i;jn;j+) R1j=Rj;void MSort(ElemType R,ElemType R1,int n) int length=1; while (lengthn) MergePass(R,R1,length,n); length=2*length; MergePass(R1,R,length,n); length=2*length; void MergeSor

25、t(SqList &L) start_t=clock(); BeforeSort(); MSort(L.elem,L.elem,L.length); display(bj1,yd1); end_t=clock(); t5=(double)(end_t-start_t)/CLK_TCK; printf(排序用时为 %fn,t5); A5=bj1; B5=yd1; C5=t5;void printf(SqList &L)long int d6;int i,n; printf(n比较次数n);printf(n=n); for(i=0;i5;i+) di= sqrt (Ai/A5); printf(n

26、 归并排序: *); printf(n=n); printf( 选择排序: ); for(n=0,i=0;n=di;n+) printf(*); printf(n=n); printf( 冒泡排序: ); for(n=0,i=1;n=di;n+) printf(*); printf(n=n); printf( 直插排序: ); for(n=0,i=2;n=di;n+) printf(*); printf(n=n); printf( 希尔排序: ); for(n=0,i=3;n=di;n+) printf(*); printf(n=n); printf( 快排排序: ); for(n=0,i=4;n=di;n+) printf(*); printf(n=n); printf(n移动次数n); printf(n=n); double e6; for(i=0;i6;i+) ei= sqrt (Bi/B3); printf(n 希尔排序: *); printf(n=n); printf( 选择排序: ); for(n=0,i=0;n=e

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

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