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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

数据结构课程设计报告各种排序实现及对比.docx

1、数据结构课程设计报告各种排序实现及对比数据结构课程设计报告设计题目:学生姓名: 系 别: 专 业: 班 级: 学 号:指导教师: 2010年版目 录一、设计题目4二、运行环境(软、硬件环境)4三、算法设计的思想4 3.1简单选择排序4 3.2直接插入排序.43.3希尔排序4 3.4冒泡排序4 3.5快速排序4四、算法的流程图.54.1主函数的算法流程图.5.4.2简单选择排序的算法流程图.64.3直接插入排序的算法流程图.74.4希尔排序的算法流程图84.5冒泡排序的算法流程图94.6快速排序的算法流程图(1).104.7快速排序的算法流程图(2).11五、算法设计分析11 5.1简单选择排序

2、11 5.2直接插入排序.125.3希尔排序12 5.4冒泡排序13 5.5快速排序13六、源代码14七、运行结果分析23八、收获及体会26一、 设计题目 各种排序二、 运行环境(软、硬件环境)软件环境: 操作系统的名称windows、版本号XP;程序开发的环境: Microsoft Visual C+ 6.0硬件环境:内存:512M,硬盘:80G三、 算法设计的思想3.1简单选择排序基本思想 每一趟在n-i+1(i=1,2,n-1)个记录中选取关键字最小的记录作为有序序列的第i个关键字。3.2插入排序基本思想 插入排序的思想就是读一个,排一个,将第个数放入数组的第个元素中,以后读入的数与已存

3、入数组的数进行比较,确定它在从大到小的排列中应处的位置将该位置以及以后的元素向后推移一个位置,将读入的新数填入空出的位置中3.3希尔排序基本思想希尔排序法是1959年由D.L.Shell提出来的,又称减少增量的排序。下表是以八个元素排序示范的例子.在该例中,开始时相隔4个成分,分别按组进行排序,这时每组2个成分,共4组;然后相隔2个成分,在按组排序.最后,对所有相邻成分进行排序.3.4冒泡排序基本思想依次比较相邻的两个数,把大的放前面,小的放后面.即首先比较第1个数和第2个数,大数放前,小数放后.然后比较第2个数和第3个数.直到比较最后两个数.第一趟结束,最小的一定沉到最后.重复上过程,仍从第

4、1个数开始,到最后第2个数.然后.由于在排序过程中总是大数往前,小数往后,相当气泡上升,所以叫冒泡排序.3.5快速排序基本思想快速排序的基本思想是基于分治策略的。对于输入的子序列Lp.r,如果规模足够小则直接进行排序,否则分三步处理:分解(Divide):将输入的序列Lp.r划分成两个非空子序列Lp.q和Lq+1.r,使Lp.q中任一元素的值不大于Lq+1.r中任一元素的值。递归求解(Conquer):通过递归调用快速排序算法分别对Lp.q和Lq+1.r进行排序。 合并(Merge):由于对分解出的两个子序列的排序是就地进行的,所以在Lp.q和Lq+1.r都排好序后不需要执行任何计算Lp.r就

5、已排好序。四、 算法的流程图4.1主函数的算法流程图开始输入数据个数lengthcreate(),visit()输入select7select6543210select_sort(L); Zhijie(L); ShellSort(L,dlta,4); Maopao(L); QuickSort(L); print(num);select_sort(L);QuickSort(L);Maopao(L);ShellSort()Zhijie(L)Exit(0)输入y/nny结束4.2简单选择排序的算法流程图开 始int i=1;假 iL.length真int j=i;k=i+1 假kL.lenth真L.

6、rj.keyL.rk.key j=k; k+ i!=j 假真 L.ri L.rji+结 束4.3直接插入排序的算法流程图开始i=2假i=L.length真L.ri.keyL.ri-1.key假真L.r0=L.ri;L.ri=L.ri-1;j=i-2;假L.r0.keyL.rj.key真L.rj+1=L.rj;-j;L.rj+1=L.r0+i结束4.4希尔排序的算法流程图开始k=0假kt真ShellInsert(&L,dltak,&r);i=dk+1;假i=L.length真假L.ri.key0&L.r0.keyL.rj.key假真L.rj+dk=L.rj;j-=dk;L.rj+dk=L.r0+

7、i+k结束4.5冒泡排序的算法流程图开 始int i=1;假 iL.length真int j=1;假 jL.length-i真L.rj.keyL.rj+1.key假真L.rj L.rj+1j+结 束i+4.6快速排序的算法流程图(1)开始Lowhigh真-high假+low真Lowhigh&L.rhigh.key=pivotkey77L.rlow=L.rhighLow=pivotkey77真L.r0=L.rlowPivotkey=L.rlow.key假L.rhigh=L.rlow结束L,low,high假4.7快速排序的算法流程图(2)开始真LowhighL,low=pivotloc+1,hi

8、gh=highPivotloc=partioion(L,low,high),low=low,high=pivotloc-1;LowhighL,low,high假真假Pivotloc=partioion(L,low,high),low=low,high=pivotloc-1;QSort(L,low,pivotloc-1)结束五、 算法设计分析5.1简单选择排序操作方法:第一趟,从n个记录中找出关键码最小的记录与第一个记录交换;第二趟,从第二个记录开始的n-1个记录中再选出关键码最小的记录与第二个记录交换;如此,第i趟,则从第i个记录开始的n-i+1个记录中选出关键码最小的记录与第i个记录交换,直

9、到整个序列按关键码有序。【效率分析】空间效率:仅用了一个辅助单元。时间效率:简单选择排序中,所需进行记录移动的操作次数较小,其最小值为0,最大值为3(n-1)。然而,无论记录的初始排列如何,所需进行的关键字之间的比较次数相同,均为n(n-1)/2。因此,总的时间复杂度也是O(n2)。5.2直接插入排序设有n个记录,存放在数组r中,重新安排记录在数组中的存放顺序,使得按关键码有序。即r1.keyr2.keyrn.key先来看看向有序表中插入一个记录的方法:设tj,tk=1;2. 按步长序列个数k,对序列进行k趟排序;3. 每趟排序,根据对应的步长ti,将待排序列分割成若干长度为m的子序列,分别对

10、各子表进行直接插入排序。仅步长因子为1时,整个序列作为一个表来处理,表长度即为整个序列的长度。希尔排序时效分析很难,关键码的比较次数与记录移动次数依赖于步长因子序列的选取,特定情况下可以准确估算出关键码的比较次数和记录的移动次数。目前还没有人给出选取最好的步长因子序列的方法。步长因子序列可以有各种取法,有取奇数的,也有取质数的,但需要注意:步长因子中除1外没有公因子,且最后一个步长因子必须为1。希尔排序方法是一个不稳定的排序方法。5.4冒泡排序冒泡排序方法:对n个记录的表,第一趟冒泡得到一个关键码最大的记录rn,第二趟冒泡对n-1个记录的表,再得到一个关键码最大的记录rn-1,如此重复,直到n

11、个记录按关键码有序的表。【效率分析】空间效率:仅用了一个辅助单元。时间效率:总共要进行n-1趟冒泡,对j个记录的表进行一趟冒泡需要j-1次关键码比较。移动次数:最好情况下:待排序列已有序,不需移动。5.5快速排序快速排序是通过比较关键码、交换记录,以某个记录为界(该记录称为支点),将待排序列分成两部分。其中,一部分所有记录的关键码大于等于支点记录的关键码,另一部分所有记录的关键码小于支点记录的关键码。我们将待排序列按关键码以支点记录分成两部分的过程,称为一次划分。对各部分不断划分,直到整个序列按关键码有序。【效率分析】空间效率:快速排序是递归的,每层递归调用时的指针和参数均要用栈来存放,递归调

12、用层次数与上述二叉树的深度一致。因而,存储开销在理想情况下为O(log2n),即树的高度;在最坏情况下,即二叉树是一个单链,为O(n)。时间效率:在n个记录的待排序列中,一次划分需要约n次关键码比较,时效为O(n),若设T(n)为对n个记录的待排序列进行快速排序所需时间。理想情况下:每次划分,正好将分成两个等长的子序列,则T(n)cn+2T(n/2) c是一个常数cn+2(cn/2+2T(n/4)=2cn+4T(n/4)2cn+4(cn/4+T(n/8)=3cn+8T(n/8)cnlog2n+nT(1)=O(nlog2n)最坏情况下:即每次划分,只得到一个子序列,时效为O(n2)。快速排序是通

13、常被认为在同数量级(O(nlog2n))的排序方法中平均性能最好的。但若初始序列按关键码有序或基本有序时,快排序反而蜕化为冒泡排序。为改进之,通常以“三者取中法”来选取支点记录,即将排序区间的两个端点与中点三个记录关键码居中的调整为支点记录。快速排序是一个不稳定的排序方法。排序方法最好时间平均时间最坏时间稳定性插入排序直接插入排序O(n)O(n2)O(n2)稳定希尔排序O(n1.5)不稳定交换排序冒泡排序O(n)O(n2)O(n2)稳定快速排序O(nlogn)O(nlogn)O(n2)不稳定选择排序直接选择排序O(n2)O(n2)O(n2)不稳定内部排序各种算法的性能比较(表)六、 源代码#i

14、nclude stdlib.h#includestdio.h#includetime.h#define MAXSIZE 200typedef int KeyType;typedef struct /定义存储记录关键字及其他信息的结构体 KeyType key; char other;RedType;typedef struct /定义存储所有记录的结构体 RedType rMAXSIZE+1; int length;SqList;typedef struct int move; /*记录数据移动次数*/ int comp; /*记录数据比较次数*/ Recode;int dlta5=31,15

15、,7,3,1; /初始化希尔排序的增量序列int num10=0; /记录每个排序方法的移动次数和比较次数int flag=0; /标记变量/利用产生的随即数模拟用户输入的数据void create(SqList *L,int length) int i; srand(time(0); L-length=length; for(i=1;ilength;i+) L-ri.key=rand()%1000; L-ri.other=rand()%26+65; /*输出元素*/ void visit(SqList L) int i; printf(n); for(i=1;i=L.length;i+) p

16、rintf(%4d%2c,L.ri.key,L.ri.other); printf(n); /*简单选择排序*/ void select_sort(SqList L) Recode r; p =0; r.move =0; int i,j,k; RedType t; for (i=1;iL.length;i+) j=i; for (k=i+1;kL.rk.key) j=k; if (i!=j) t=L.rj; L.rj=L.ri; L.ri=t; r.move =r.move +3; if(!flag) printf(本次随机数据排序的移动次数为:); printf(%dn,r.move); p

17、rintf(本次随机数据排序的比较次数为:); printf(%dn,p); printf(简单选择排序后的结果:); visit(L); elsenum0=r.move;num1=p; /直接插入排序void Zhijie(SqList L) Recode r; p =0; r.move =0; int j; for(int i=2;i=L.length;+i) p +; if(L.ri.keyL.ri-1.key) L.r0=L.ri; /复制为哨兵 L.ri=L.ri-1; r.move=r.move +2; for(j=i-2;L.r0.key L.rj.key;-j) L.rj+1=

18、L.rj; /记录后移 r.move +; p +; L.rj+1=L.r0; /插入到正确位置 r.move +; if(!flag) printf(本次随机数据排序的移动次数为:); printf(%dn,r.move); printf(本次随机数据排序的比较次数为:); printf(%dn,p); printf(直接插入排序后的结果:); visit(L); elsenum2=r.move;num3=p; /希尔排序void ShellInsert(SqList *L,int dk,Recode *r) int i,j; for(i=dk+1;ilength ;+i) r-comp +

19、; if(L-ri.keyri-1.key) L-r0=L-ri; /暂存 r-move +; for(j=i-dk;j0&(L-r0.key rj.key);j-=dk) L-rj+dk=L-rj; /记录后移 r-move +; r-comp +; L-rj+dk=L-r0; /插入到正确位置 r-move +; void ShellSort(SqList L,int dlta,int t) /按增量序列dlta0.t-1对顺序表L作希尔排序。 Recode r; p =0; r.move =0; int k; for(k=0;kt;+k) ShellInsert(&L,dltak,&r)

20、;/一趟增量为dltak的插入排序 if(!flag) printf(本次随机数据排序的移动次数为:); printf(%dn,r.move); printf(本次随机数据排序的比较次数为:); printf(%dn,p); printf(希尔排序后的结果:); visit(L); elsenum4=r.move;num5=p;/冒泡排序法void Maopao(SqList L) Recode r; p =0; r.move =0; int i,j; RedType t; for(i=1;iL.length;i+) for(j=1;jL.rj+1.key) r.move =r.move +3

21、; t=L.rj; L.rj=L.rj+1; L.rj+1=t; if(!flag) printf(本次随机数据排序的移动次数为:); printf(%dn,r.move); printf(本次随机数据排序的比较次数为:); printf(%dn,p); printf(冒泡排序后的结果:); visit(L); elsenum6=r.move;num7=p;/快速排序法int Partition(SqList *L,int low,int high,Recode *r) int pivotkey; L-r0=L-rlow; /用子表的第一个记录作枢轴记录 pivotkey=L-rlow.key

22、; /枢轴记录关键字 r-move =r-move +2; while(lowhigh) /从表的两端交替的向中间扫描 while(lowrhigh.key =pivotkey) -high; r-comp +; L-rlow=L-rhigh; /将比枢轴记录小的记录移到低端 while(lowrlow.key comp+; L-rhigh=L-rlow; /将比枢轴记录大的记录移到高端 r-move =r-move+2; L-r low=L-r 0; /枢轴记录到位 r-move +; return low; /返回枢轴位置void QSort(SqList *L,int low,int high,Recode *r) int pivotloc; if(lowrlow.high一分为二 QSort(L,low,pivotloc-1,r); /对低子表递归排序,pivotloc是枢轴位置 QSort(L,pivotloc+1,high,r); /对高子表递归排序 void QuickSort(SqList L) Recode r; p =0; r.move =0; QSort(&L,1,L.length,&r); if(!flag) printf(本次随机数据排序的移动次数为:); printf(%dn,r.move); printf(本次

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

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