




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、精选优质文档-倾情为你奉上学 院××××学院班 级××××××××学 号××××××××姓 名×××目录1 摘要1.1 设计题目算法型大作业题目:编写七种排序算法的演示程序。1.2 设计内容编写快速排序、插入排序、选择排序、冒泡排序、堆排序、归并排序、基数排序函数,通过主函数调用以实现七种排序算法的演示。1.3 开发工具Visual C+ 6.01.4 应用平台Win
2、dows 2000/XP/Vista 32位2 详细设计2.1 程序结构程序的整体结构与流程见下图所示。程序运行时在主菜单中输入序号选择排序方法或选择结束程序,当进行某种排序方法后,在主函数中输入待排数据个数和待排数据,通过调用对应的排序函数实现排序并输出。该排序结束后再次进入主函数,通过循环重复上述操作。其中,主函数中将数组地址和待排序数据个数传递给排序函数,在排序函数中实现排序功能。输出排序结果开始快速插入选择冒泡堆排归并基数选择排序方法进入主菜单退出系统2.2 主要功能函数的功能为对快速排序、插入排序、选择排序、冒泡排序、堆排序、归并排序、基数排序算法的演示。主函数:程序运行时,可使运行
3、者根据提醒输入相关操作,从而进入不同的排序方法或者退出。快速排序函数:根据快速排序的算法,最后输出插入排序函数:根据插入排序的算法,最后输出选择排序函数:根据选择排序的算法,最后输出冒泡排序函数:根据冒泡排序的算法,最后输出堆排序函数:根据堆排序的算法,最后输出归并排序函数:根据归并排序的算法,最后输出基数排序函数:根据基数排序的算法,最后输出2.3 函数实现主函数:在主函数中对菜单输出,通过switch语句中的case分支选择所需要的排序方法;通过while循环使演示程序在运行时能够持续进行快速排序: 快速排序(kuaisu)又被称做分区交换排序,这是一种平均性能非常好的排序方法。其算法基本
4、思想是:任取排序表中的某个数据元素(例如取第一个数据元素)作为基准,按照该数据元素的关键字大小,将整个排序表划分为左右两个子表: 左侧子表中所有数据元素的关键字都小于基准数据元素的关键字。右侧子表中所有数据元素的关键字都大于或等于基准数据元素的关键字,基准数据元素则排在这两个子表中间(这也是该数据元素最终应安放的位置),然后分别对这两个子表重复施行上述方法的快速排序,直到所有的子表长度为1,则排序结束。插入排序:插入排序(charu)的基本思想:开始时把第一个数据元素作为初始的有序序列,然后从第二个数据元素开始依次把数据元素按关键字大小插入到已排序的部分排序表的适当位置。当插入第i(1<
5、i<=n)个数据元素时,前面的i-1个数据元素已经排好序,这时,用第i个数据元素的关键字与前面的i-1个数据元素的关键字顺序进行比较,找到插入位置后就将第i个数据元素插入。如此进行n-1次插入,就完成了排序。以下是在顺序表上实现的直接插入排序在顺序表上进行直接插入排序时,当插入第i(1<i<=n)个数据元素时,前面的A0、A1、Ai-2已经排好序,这时,用Ai-1的关键字依次与Ai-2,Ai-3,的关键字顺序进行比较,如果这些数据元素的关键字大于Ai-1的关键字,则将数据元素向后移一个位置,当找到插入位置后就将Ai-1插入,就完成了A0,A1,An-1的排序。选择排序选择排序
6、(xuanze)的算法基本思想是:a)开始时设i的初始值为0。b)如果i<n-1,在数据元素序列Ai(An-1中,选出具有最小关键字的数据元素Ak;否则算法结束。c)若Ak不是这组数据元素中的第一个数据元素(ik),则将Ak与Ai这两数据元素的位置对调;d)令i=i+1转步骤 b)。冒泡排序:冒泡排序(maopao) 的基本思想是:设排序表中有n个数据元素。首先对排序表中第一,二个数据元素的关键字A0和A1进行比较。如果前者大于后者,则进行交换;然后对第二,三个数据做同样的处理;重复此过程直到处理完最后两个相邻的数据元素。我们称之为一趟冒泡,它将关键字最大的元素移到排序表的最后一个位置,
7、其他数据元素一般也都向排序的最终位置移动。然后进行第二趟排序,对排序表中前n-1个元素进行与上述同样的操作,其结果使整个排序表中关键字次大的数据元素被移到An-2的位置。如此最多做n-1趟冒泡就能把所有数据元素排好序。堆排序:堆排序(duipai)sa.对排序表中的数据元素,利用堆的调整算法形成初始堆。b.输出堆顶元素。c.对剩余元素重新调整形成堆。d.重复执行第b、c步,直到所有数据元素被输出。如果建立的堆满足最大堆的条件,则堆的第一个数据元素A0具有最大的关键字,将A0与An-1对调,把具有最大关键字的数据元素交换到最后,再对前面的n-1个数据元素使用堆的调整算法,重新建立最大堆,结果把具
8、有次最大关键字的数据元素又上浮到堆顶,即A 0的位置,再对调A0和An-2,如此反复执行n-1次,最后得到全部排序好的数据元素序列。归并排序:其基本思想是:设有两个有序表A和B,其数据元素个数(表长)分别为n和m,变量i和j分别是表A和表B的当前检测指针;设表C是归并后的新有序表,变量k是它的当前存放指针。开始时i、j、k都分别指向A、B、C三个表的起始位置;然后根据Ai与Bj的关键字的大小,把关键字小的数据元素放到新表Ck中;且相应的检测指针(i或j)和存放指针k增加1.如此循环,当i与j中有一个已经超出表长时,将另一个表中的剩余部分照抄到新表CkCm+n中。下面的归并算法中,两个待归并的有
9、序表首尾相接存放在数组sourcetable.arr中,其中第一个表的下标范围从left到mid,另一个表的下标范围从mid+1到right。前一个表中有mid-left+1个数据元素,后一个表中有right mid个数据元素。归并后得到的新有序表有right mid个数据元素。归并后得到的新有序表存放在另一个辅助数组mergedtable.arr中,其下标范围从left到right。一趟归并算法:设数组sourcetable.arr0到sourcetable.arrn-1中的n个数据元素已经分为一些长度为len的归并项,将这些归并项两两归并,归并成一些长度为2len的归并项,结果放到merg
10、edtable.arr中。如果n不是2len的整数倍,则一趟归并到最后,可能遇到两种情况:剩下一个长度为len的归并项和一个长度不足len的归并项,可用一次merge算法,将它们归并成一个长度小于2len的归并项。只剩下一个归并项,其长度小于或等于len,可将它直接复制到数组mergedtable.arr中。在一趟归并算法的基础上,实现两路归并排序算法。在两路归并排序算法中,初始排序表存放在数组table.arr中,第一趟归并将table.arr中的归并项两两归并,结果存放在辅助数组temptable.arr中。第二趟将temptable.arr中的归并项两两归并,结果放回原数组table.a
11、rr中,如此反复进行。为了将最后归并结果仍放在数组table.arr中,归并趟数应为偶数。如果做奇数趟就能完成时,最后还需要执行一次一趟归并过程,由于这时的归并项长度len>=n,因此在则趟归并中while循环不执行,只做把temptable.arr中的数据元素复制到table.arr的工作。基数排序:“基数排序法”(radix sort)则是属于“分配式排序”(distribution sort),基数排序法又称“桶子法”(bucket sort)或bin sort,顾名思义,它是透过键值的部份资讯,将要排序的元素分配至某些“桶”中,藉以达到排序的作用,基数排序法是属于稳定性的排序,其
12、时间复杂度为O (nlog(r)m),其中r为所采取的基数,而m为堆数,在某些时候,基数排序法的效率高于其它的比较性排序法。具体可以参看后面的代码进行理解。其它:使用了stdlib头文件里包含的系统函数,包括清屏函数和运行时的暂停,增强了程序运行时的效果。2.4 开发日志在老师布置了大作业的题目后,我就把题目下载下来并进行分析已选择合适的题目。经过我的慎重考虑,选择了算法型大作业题目中的编写七种排序算法的演示程序,觉得自己有能力把这道题目很好完成。在认真分析连题目后,基本确定了整体的思路,但是其中有堆排序,归并排序,基数排序我没有在教材中接触过,于是借助了图书馆和网络上的资源,重点对这三的函数
13、进行编写。在编写大作业过程中大的困难我没有遇到,只是有些小的疏忽常常导致程序无法运行,如形参和实参的不一致等。我也在其中意识到对知识掌握的不够熟练,在解决了这些问题后,我觉得自己对程序的编写更加熟练了,对问题的分析也更加严谨了。在C程序设计的实验和理论考试之前代码已基本完成。在考试结束后,我又对程序稍微进行了修改,使之运行时效果更好。接着开始写实验报告,整理自己的大作业。我对我的作业是很满意的。3 程序调试及运行3.1 程序运行结果1.进入程序运行后所显示的菜单:2.快速排序:3.插入排序:4.选择排序:5.冒泡排序:6.堆排序:7.归并排序:8.基数排序:9.结束:3.2 程序使用说明1.打
14、开源程序,调试完毕后开始运行,开始进行七种算法的演示;2.按照说明进行输入,选择数字17即可进入相应的排序算法演示程序,选择8结束程序;3.选择排序的方法后,按要求输入待排数据的个数,然后输入待排序数据即可(数据排序结束后,会自动清屏,进入菜单进行接下来的选择);4.应当注意,本演示程序对数据进行的是升序;3.3 程序开发总结在选择这个题目时,我觉得难度系数10对我有挑战性,并且我对排序有相对比较熟悉,所以就选了这个题目。但是在编写过程中却遇到很多问题。我和我的同学进行了讨论,查阅了图书馆和网络上的资料,结合力我个人对本题目的理解对各种问题进行了处理,学到了很多教材上没有的知识。从这次实践中,
15、我意识到自己还有很多不足之处。能力也得到了提高。我在进行编程时还需要翻书查找,对于这一点,只能说对知识的学习还不够扎实,所以有空时还应该继续熟悉这门课程。另外,就是对于错误的处理,不能得心应手,不能正确处理一些简单的错误。对于逻辑上的错误,不能够立即找到出错点,往往需要向同学请教才能找出错误,并且改正。我觉得这是自己独自思考能力不高的问题,遇事需要自己仔细想想,若还不能改正,再请教别人也不迟。从总体上说,最终结果我很满意,我觉得我所设计的程序操作方便,功能良好。我在上面花费了很多时间和精力,对作业不断进行修改和完善,我很有成就感 。我的能力在这之中得到了提高。4 附件(源程序)# includ
16、e<stdio.h># include<stdlib.h>/*快速排序*/void kuaisu(int A,int n)int i,j,k,t,p;for(i=0;i<n-1;i+)k=i;for(j=i+1;j<n;j+)if(Aj<Ak) k=j;t=Ak;Ak=Ai;Ai=t;printf("第%d趟:",i+1);for(p=0;p<n;p+)printf("%d ",Ap);printf("n");printf("n排序结果:");for(i=0;i<
17、;n;i+)printf("%d ",Ai);printf("n");printf("n");system("pause");system("CLS");/*插入排序*/void charu(int A,int n) int i,k,t,j,h=1;for(i=1;i<n;i+)t=Ai;k=i-1;while(t<Ak)Ak+1=Ak;k-;if(k=-1)break;printf("第%d趟:",h+);for(j=0;j<n;j+)printf(&qu
18、ot;%d ",Aj);printf("n");Ak+1=t;printf("n排序结果:");for(i=0;i<n;i+)printf("%d ",Ai);printf("n");printf("n");system("pause");system("CLS");/*选择排序*/void xuanze(int A,int n) int i,j,k,t,l,h=1;for(i=0;i<n-1;i+)k=i;for(j=i+1;j&l
19、t;n;j+)if(Aj<Ak) k=j;if(i!=k)t=Ai;Ai=Ak;Ak=t;printf("第%d趟:",h+);for(l=0;l<n;l+)printf("%d ",Al);printf("n");printf("n排序结果:");for(i=0;i<n;i+)printf("%d ",Ai);printf("n");printf("n");system("pause");system("C
20、LS");/*冒泡排序*/void maopao(int A,int n) int i,j,t,h=1,p;for(j=0;j<n-1;j+)for(i=0;i<n-1-j;i+)if(Ai>Ai+1)t=Ai,Ai=Ai+1,Ai+1=t,p+;printf("第%d趟:",h+);for(p=0;p<n;p+)printf("%d ",Ap);printf("n");printf("n排序结果:");for(i=0;i<n;i+)printf("%d "
21、;,Ai);printf("n");printf("n");system("pause");system("CLS");/*堆排序*/void shift(int A , int i , int m) int k,t; t=Ai;k=2*i+1; while (k<m) if(k<m-1)&&(Ak<Ak+1) k+; if(t<Ak)Ai=Ak;i=k;k=2*i+1; else break; Ai=t;void duipai(int A , int n) /a 为排序数组
22、,n为数组大小int i,k,h=1,j;for (i=n/2-1;i>=0;i-)shift(A,i,n); for (i=n-1;i>=1;i-)k=A0;A0=Ai;Ai=k;shift(A,0,i);printf("第%d趟:",h+);for(j=0;j<n;j+)printf("%d ",Aj);printf("n");printf("n排序结果:");for(i=0;i<n;i+)printf("%d ",Ai);printf("n");
23、printf("n");system("pause");system("CLS");/*归并排序*/void merge(int number,int first,int last,int mid) int number_temp10=0; int i=first,j=mid+1,k; for(k=0;k<=last-first;k+) if (i=mid+1) number_tempk=numberj+; continue; if (j=last+1) number_tempk=numberi+; continue; if (
24、numberi<numberj) number_tempk=numberi+; else number_tempk=numberj+; for (i=first,j=0;i<=last;i+,j+) numberi = number_tempj;void merge_sort(int number,int first,int last) int mid=0; if(first<last) mid=(first+last)/2; merge_sort(number,first,mid); merge_sort(number,mid+1,last); merge(number,f
25、irst,last,mid); void guibing(int a,int n)int i;merge_sort(a,0,n-1);printf("n排序结果:");for(i=0;i<n;i+) printf("%d ",ai);printf("n");printf("n");system("pause");system("CLS");/*基数排序*/void jishu(int data,int n)int temp1010=0; int order10=0; i
26、nt i,j,k,q,lsd; k=0; q=1; while(q<=n) for(i=0;i<n;i+) lsd=(datai/q)%n); templsdorderlsd=datai; orderlsd+; for(i=0;i<n;i+) if(orderi != 0) for(j=0;j<orderi;j+) datak=tempij; k+; orderi = 0; q *= n; k = 0; printf("n排序结果:");for(i=0;i<n;i+)printf("%d ",datai);printf("n");printf("n");system("pause");system("CLS"
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 人力资源社会保障部劳动合同示范文本(终稿)2篇
- 奶茶店用工协议书7篇
- 二手房协议书范本6篇
- 赡养子女协议书6篇
- 租赁物业场地合同范本
- 珍爱网婚介合同范本
- 人参采购合同范本
- 班班通维修合同范本
- 中日合资协议合同范本
- 出售农村别墅合同范本
- JG/T 270-2010工业构筑物水泥基耐磨材料
- 建立隐患闭环管理制度
- 《多样的美术门类》教学课件-2024-2025学年赣美版(2024)初中美术七年级上册
- T/CECS 10026-2019绿色建材评价建筑门窗及配件
- 企业往来款协议书
- 2025山东中考:生物高频考点
- DB65T 4815-2024 清洗消毒中心内畜禽及其产品运输车辆消毒技术规范
- 《儿童癫痫护理指南》课件
- 数学三年级上册二 观察物体1 看一看(一)教学设计
- 2025-2030中国PEM水电解槽行业现状调查与发展前景规划研究研究报告
- 2025年中国人保财险全系统黑龙江分公司招聘笔试参考题库含答案解析
评论
0/150
提交评论