常用排序算法课程设计报告(共31页).doc

上传人:飞****2 文档编号:14256205 上传时间:2022-05-03 格式:DOC 页数:31 大小:428.50KB
返回 下载 相关 举报
常用排序算法课程设计报告(共31页).doc_第1页
第1页 / 共31页
常用排序算法课程设计报告(共31页).doc_第2页
第2页 / 共31页
点击查看更多>>
资源描述

《常用排序算法课程设计报告(共31页).doc》由会员分享,可在线阅读,更多相关《常用排序算法课程设计报告(共31页).doc(31页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、精选优质文档-倾情为你奉上重庆科技学院课程设计任务书设计题目:常用排序算法的比较学生姓名*课程名称数据结构课程设计专业班级 *地 点计算机基础自主学习中心起止时间 2011.11.16-12.5设计内容及要求利用随机函数产生N个随机整数,采用多种方法对这些数进行排序,然后分析各自的所需的排序时间找出较快的排序算法。要求:1) 分别采用的排序算法有插入排序、希尔排序、起泡排序、快速排序、选择排序、堆排序、归并排序,实现这批数据的排序,并把排序后的结果保存在不同的文件中。2) 统计每一种排序算法的性能(以上机运行程序所花费的时间为准进行对比),找出其中两种较快的算法。注:在完成以上数据的同时,还能

2、采用其它的排序算法,适当加分。设计参数 测试数据要求:随机产生1000 个以上的随机整数,并保存在文本文件中。排序后的数据和所需的时间也保存在各自的txt文件中。进度要求 参考资料1严蔚敏 吴伟民 著, 数据结构,清华大学出版社,2007.32李春葆 著,数据结构教程,清华大学出版社,2005.13. Richard F.Gilberg Behrouz A.Forouzan, 数据结构的C+伪码实现(英文版),人民邮电出版社,2002.1其它说明.本表应在每次实施前一周由负责教师填写二份,院系审批后交院系办备案,一份由负责教师留用。.若填写内容较多可另纸附后。3.一题多名学生共用的,在设计内容

3、、参数、要求等方面应有所区别。教研室主任: 指导教师: 2011年 11月 16日专心-专注-专业摘要排序算法是数据结构学科经典的内容,其中内部排序现有的算法有很多种,其中包含冒泡排序,直接插入排序,简单选择排序,希尔排序,快速排序,堆排序等,各有其特点。对排序算法比较的分析可以遵循若干种不同的准则,通常以排序过程所需要的算法步数作为度量,有时也以排序过程中所作的键比较次数作为度量。特别是当作一次键比较需要较长时间,例如,当键是较长的字符串时,常以键比较次数作为排序算法计算时间复杂性的度量。当排序时需要移动记录,且记录都很大时,还应该考虑记录的移动次数。究竟采用哪种度量方法比较合适要根据具体情

4、况而定。本报告将描述如何利用随机函数产生N个随机整数,采用多种方法对这些数进行排序,然后分析各自的所需的排序时间找出较快的排序算法。关键词:排序算法 数据结构 随机函数 目录1 设计内容和要求1.1 设计内容利用随机函数产生N个随机整数,采用多种方法对这些数进行排序,然后分析各自的所需的排序时间找出较快的排序算法。1.2 设计要求1) 分别采用的排序算法有插入排序、希尔排序、起泡排序、快速排序、选择排序、堆排序、归并排序,实现这批数据的排序,并把排序后的结果保存在不同的文件中。 2) 统计每一种排序算法的性能(以上机运行程序所花费的时间为准进行对比),找出其中两种较快的算法。2 需求分析2.1

5、 直接插入排序思路:设有一组关键字K1,K2,.,Kn,排序开始变认为K1是一个有序的序列,让K2插入到表长为1的有序序列,使之成为一个表长为2的有序序列, 让K3插入到表长为2的有序序列,使之成为一个表长为3的有序序列,依次类推,最后让Kn插入上述表长为n-1的有序序列,得到一个表长为n的有序序列.2.2 希尔排序思路:先取一个正整数d1(d1n),把全部记录分成d1个组,所有距离为d1的倍数的记录看成是一组,然后在各组内进行插入排序;然后取d2(d2=1),即所有记录成为一个组为此.一般选d1约为n/2,d2为d1/2,.,di=12.3 快速排序:(递归和非递归)思路:以第一个关键字K1

6、为控制字,将K1、K2、.Kn分成两个子区,使左区的有关键字小于等于K1,右区所有关键字大于等于K1,最后控制居两个子区中间的适当位置。在子区内数据尚处于无序状态。将右区首、尾指针保存入栈,对左区进行与第(1)步相类似的处理,又得到它的左子区和右子区,控制字区中。重复第(1)、(2)步,直到左区处理完毕。然后退栈对一个个子区进行相类似的处理,直到栈空。分区处理函数hoare思路:首先用两个指针i、j分别指向首、尾两个关键字,i=1,j=8。如对(46、56、14、43、95、10、19、72)。第一个关键字46作为控制字,该关键字所属的记录另存储在一个x变量中。从文件右端元素rj.key开始与

7、控制字x.key相比较,当rj.key大于等于x.key时,rj不移动,修改指针j,j-,直到rj.keyx.key,把记录rj移动到文件左边i所指向的位置;然后在文件左边修改i指针,i+,让ri.key与x.key相比较,当ri.key小于等于x.key时,ri不移动,修改指针i,i-,直到ri.keyx.key, 把记录ri移动到文件右边j所指向的位置;然后在文件右边修改j指针j-。重复上面的步骤.2.4 堆排序思路:把n个记录存于向量r之中,把它看成完全二叉树,此时关键字序列不一定满足堆的关系。堆排序大体分为两步处理:初建堆,从堆的定义出发,当i=1、2、。、2/n时应满足ki=k2i和

8、ki=k2i+1.所以先取i=n/2(它一定是第n个结点的双亲编号),将以i结点为根的子树调整为堆,然后令i=i-1,将以不结点为根的子树调整为堆。此时可能会反复调整某些结点,直到i=1为止,堆初步建成。堆排序,首先输出堆顶元素(一般是最小值),让堆中最后一个元素上移到原堆顶位置,然后恢复堆。因为经过第一步输出堆顶元素的操作后,往往破坏了堆关系,所以要恢复堆;重复执行输出堆顶元素、堆尾元素上移和恢复堆的步骤。3 概要设计3.1 头文件#include#include#include#include3.2 ADT struct element int key;list20;struct rnod

9、eint key;int point;3.3 各种操作函数:(1)创建一个数组函数:int creat();(2)输出数组函数:void print(struct element a20,int n);(3)保存函数:void save(struct element aSIZE,int n, char fileName ) (4)直接插入排序函数:void insert_sort(element a, int n)(5)希尔排序函数:void shell(struct element a20,int n);(6)快速排序函数(分区处理函数):int hoare(struct element a

10、20,int l,int h);(7)非递归的快速排序函数:void quick1(struct element a20,int n);(8)递归的快速排序函数:void quick2(struct element a20,int l,int h);(9)堆排序(调整堆的函数):void heap(struct element a20,int i,int m);(10)堆排序(主体函数):void heapsort(struct element a20,int n);(11)时间函数:start = clock();end = clock();3.4 主函数Void main()接受命令(选择

11、要执行的操作);处理命令;输出结果; 4 详细设计4.1 主函数如下:为程序主函数。#include#include#include#include#define SIZE struct element int key;listSIZE;/创建一个数组/int creat() int i,n; int num;n=0;printf(请输入元素个数:);scanf(%d,&num);for( i = 0;i num; i+ )listn.key = rand() % 10000;n+;return(n);/输出数组/void print(struct element aSIZE,int n) i

12、nt i;for(i=0;in;i+) printf(%5d,ai .key); printf(n);/保存到文件/void save(struct element aSIZE,int n, char fileName ) int m_wr=0; / 写入TXT文件变量 FILE *fp;if ( ( fp = fopen ( fileName, w ) ) = NULL ) printf(File writer errorn); for (int m=0; melem ) / 如果线性表为空exit ( ERROR ); for ( i=2; iLength; +i) key = L-ele

13、mi; / 设定关键字if ( key elemi-1 ) / 与前一个数字比较,是否“elemi = L-elemi-1;L-elemi-1 = key;for ( j=i-2; key elemj ; -j ) L-elemj+1 = L-elemj; / 数据后移L-elemj+1 = key; / 插入到正确位置if ( ( fp = fopen ( D:顺序表直接插入排序.txt, a+ ) ) = NULL ) exit ( ERROR ); for ( n=0; nLength; n+ )m_wr = L-elemn; / 获取线性表元素fprintf ( fp, %d , m_

14、wr ); / 写入TXT中 fclose ( fp );4.3 希尔排序如下:为希尔排序算法。void shell(struct element aSIZE,int n)int i,j,k;for(i=n;i=1;i-)ai.key=ai-1.key;k=n/2;while(k=1)for(i=k+1;ia0.key)&(j=0)aj+k.key=aj.key;j=j-k;aj+k=a0;k=k/2;for(i=0;ielem ) exit ( ERROR ); for ( j=1; jLength; j+ ) / j控制排序长度 for ( i=0; iLength-j; i+ ) / 每

15、趟排序长度减1 if ( L-elemi elemi+1 ) / 顺序不变key = L-elemi+1; / 将较大值赋给keyelse / 如果小于,顺序交换key = L-elemi; / 利用关键字L-elemi = L-elemi+1; L-elemi+1 = key;if ( ( fp = fopen ( D:顺序表冒泡排序.txt, a+ ) ) = NULL ) exit ( ERROR );for ( n=0; nLength; n+ )m_wr = L-elemn; fprintf(fp, %d , m_wr ); fclose ( fp );4.5 快速排序如下:为快速排

16、序算法。int InsertClass:Partition ( SqList *L, int low, int high )/ 交换子表中记录int key = 0;if ( !L-elem ) exit ( ERROR ); key = L-elemlow; / 将子表的第一个做为记录的关键字while ( low high ) / 从表的两端交替向中间扫描 while ( lowelemhigh = key ) -high; L-elemlow = L-elemhigh; / 将比枢轴记录小的记录移到低端while ( lowelemlowelemhigh = L-elemlow; / 将

17、比枢轴记录大的记录移到高端L-elemlow = key; / 枢轴记录到位return low; / 反回low的位置void InsertClass:QSort ( SqList *L, int low, int high )/ 对子表进行快速排序int pivotloc=0; if ( low elemlow.high一分为二QSort ( L, low, pivotloc-1 ); / 低子表递归排序QSort ( L, pivotloc+1, high ); / 高子表递归排序void InsertClass:QuickSort ( SqList *L )/对顺序表L作快速排序int

18、 m_wr = 0;unsigned long n; FILE *fp; QSort ( L, 0, L-Length-1 ); / 调用递归函数进行排序if ( ( fp = fopen ( D:顺序表快速排序.txt, a+ ) ) = NULL ) exit (ERROR );for ( n=0 ; nLength ; n + )m_wr = L-elemn; fprintf ( fp, %d , m_wr ); fclose ( fp );4.6 选择排序如下:为选择排序算法void InsertClass:TreeSort ( SqList *L ) / 对顺序表L进行树形选择排序

19、int m_wr = 0;unsigned long floor, crunode,crunode1;unsigned long i, j, j1, m, n; ElemType *t; FILE *fp;if ( !L-elem ) exit ( ERROR );m = L-Length; floor = ( unsigned long ) ceil ( log(m) / log(2) ) + 1; / 完全二叉树的层数 crunode = ( unsigned long ) pow ( 2, floor ) - 1; / floor层完全二叉树的结点总数 crunode1 = ( unsi

20、gned long ) pow ( 2, floor - 1 ) - 1; / floor-1层完全二叉树的结点总数 t = (ElemType*) malloc ( crunode * sizeof ( ElemType ) ); / 二叉树采用顺序存储结构 / 创建完全二叉树 for ( i=0; ielem赋给叶子结点 tcrunode1+i = L-elemi; for ( i=crunode1+m; icrunode; i+ ) / 给多余的叶子的关键字赋无穷大 ti = INT_MAX; / 头文件中的 j1 = crunode1; j = crunode; / 给非叶子结点赋值

21、while ( j1 ) for ( i=j1; ij; i+=2 ) ti ti+1 ? (t(i+1)/2-1=ti) : (t(i+1)/2-1 = ti+1); / 条件?表达式:表达式 j = j1; j1 = (j1-1) / 2; for ( i=0; ielemi L-elemi = t0; / 将当前最小值赋给L-elemi j1 = 0; for ( j=1; jfloor; j+ ) / 沿树根找结点t0在叶子中的序号j1 t2*j1+1 = tj1 ? (j1=2*j1+1) : (j1=2*j1+2); /if-else语句 tj1 = INT_MAX; while

22、( j1 ) j1 = (j1+1) / 2 - 1; / 序号为j1的结点的双亲结点序号 t2*j1+1 = t2*j1+2 ? (tj1=t2*j1+1) : (tj1=t2*j1+2); if ( (fp = fopen ( D:顺序表树形选择排序.txt, a+ ) ) = NULL ) exit ( ERROR );for ( n=0; nLength; n+ )m_wr = L-elemn; fprintf ( fp, %d , m_wr ); fclose ( fp ); free ( t );4.7 堆排序如下:为堆排序算法void InsertClass:InitHeap (

23、 SqList *L, int n )/ 初始化大顶堆int key = 0; int i, j, k; for( i=(n-1)/2; i=0; i- ) / 从编号最大的终端节点开始 j = 2 * i + 1; / 编号为j的节点是i的左孩子 k = i; if( L-elemj elemj+1 & j+1elemj L-elemk & 2*k+1 elemk; / 如果大于,则交换 L-elemk = L-elemj; L-elemj = key;k = j; j = 2 * k + 1;if( L-elemj+1 L-elemj & j+1 n) / 交换以后可能造成堆的破坏,需要从

24、交换的节点往后调整j+;/ 大顶堆调整void InsertClass:AdjustHeap(SqList *L,int n) int key = 0; int i = 0;int j = 0; while ( 2*i+1 elemj elemj+1 & j+1elemj L-elemi ) / 交换 key = L-elemi; / 利用关键字做中间保介质 L-elemi = L-elemj; L-elemj = key; i = j; / 对顺序表L进行堆排序void InsertClass:HeapSort(SqList *L)int key = 0;int m_wr = 0; int

25、i = 0;unsigned long n;FILE *fp;if ( !L-elem ) exit ( ERROR ); InitHeap ( L, L-Length ); / 初始化大顶堆 for ( i=L-Length-1; i0; i- ) / 输出堆顶元素,不断调整堆if ( L-elem1 L-elem0 ) / 此句极其重要break;key = L-elemi; / 利用关键字L-elemi = L-elem0;L-elem0 = key;AdjustHeap ( L, i-1 ); / 调整if ( ( fp = fopen ( D:顺序表堆排序.txt, a+ ) )=N

26、ULL ) exit ( ERROR );for ( n=0; nLength; n+ )m_wr = L-elemn; fprintf ( fp, %d , m_wr ); fclose ( fp );4.8 归并排序如下:为归并排序算法int b;void InsertClass:Merge ( int a, int low, int middle, int high )/ 将相邻两个子表合并 int h, i, j, k; h = low; i = low; j = middle+1; while ( h=middle & j=high ) / 前段子表 if ( ahmiddle )

27、/ 后段子表 for ( k=j; k=high; k+ ) / 排序后的值放入到b后段中 bi = ak; i+; else for ( k=h; k=middle; k+ ) bi = ak; i+; for ( k=low; k=high; k+ ) ak = bk; void InsertClass:Msort(int a,int low,int high)/ 利用递归进行归并排序 int middle = 0; / 两子表的分隔点 if ( lowhigh ) middle = (low+high) / 2; Msort ( a, low, middle ); / 前段子表排序 Ms

28、ort ( a, middle+1, high ); / 后段子表排序 Merge ( a, low, middle, high ); void InsertClass:MergeSort ( SqList *L ) / 对顺序表L作归并排序 int m_wr = 0;unsigned long n;FILE *fp; Msort ( (*L).elem, 0, (*L).Length-1 ); if ( ( fp = fopen ( D:顺序表归并排序.txt, a+ ) ) = NULL ) exit (ERROR );for ( n=0; nLength; n+ )m_wr = L-el

29、emn; fprintf(fp, %d , m_wr ); fclose ( fp );5 系统测试它的的任务是尽可能彻底地检查出程序中的错误,提高软件系统的可靠性,其目的是检验系统做得怎样?。这阶段又可分为三个步骤:模块测试,测试每个模块的程序是否有错误;组装测试,测试模块之间的接口是否正确;确认测试,测试整个软件系统是否满足用户功能和性能的要求。该阶段结束应交付测试报告,说明测试数据的选择,测试用例以及测试结果是否符合预期结果。测试发现问题之后要经过调试找出错误原因和位置,然后进行改正。是基于系统整体需求说明书的黑盒类测试,应覆盖系统所有联合的部件。系统测试是针对整个产品系统进行的测试,目

30、的是验证系统是否满足了需求规格的定义,找出与需求规格不相符合或与之矛盾的地方。系统启动选择界面。5.1 系统操作图 5.1.1 系统主界面图 5.1.2生成排序元素图 5.1.3直接插入排序图 5.1.4希尔排序图5.1.5非递归的快速排序图5.1.6递归的快速排序图5.1.7堆排序5.2 测试数据图5.2.1 100个数据元素图5.2.2 1000个数据元素图5.2.3 10000个数据元素图5.2.4、个数据元素6 总结在接触数据结构一段时间下来,通过对各种题型的操作,对线性表中顺序存储结构和链式存储结构有了感性认识,同时在老师的带领下不断进行自我完善,纠正由于思考不深引起的误区。比起C语

31、言而言,数据结构是以C为基础,但要求的质量更高,篇幅也在加大,逻辑思维的要求也相应提高。数据结构仍然强调布局,要想对课题进行全面的剖析,深入了解到它的本质,在脑海里投影出总体的框架,考虑结构体中参数也是至关重要的,要知道一个比较好的程序,不仅要求清楚易懂,还要讲究运行速度即时间复杂度,毕竟这是产生经济效应的基础。接下来就是如何将大脑的想法幻化成现实,如何才能将思想替换为正确的可执行的程序是主体,有时候理想和现实可能只有一步之遥,但你不去实践那就会相隔千里,实践中出真知是学习数据结构中给我复习的。数据结构的思想是培养我们的逻辑思维,同时透露出一种思维方式,怎样将程序变得容易操作,因为和C语言相比

32、,数据结构有固定的格式程序,如何将以前的基本结构引用过来是节约宝贵时间的有力保障,也因此数据结构强调文件包含的一个原因,对于一个相对复杂的程序需要化大为小,抓住它的循环体就能做到。说一句话只需要几秒中时间,但将思想变成现实却是需要你花上一件小事所用时间几千几万倍才能完成,理想与现实总是不等价的,但只要选择坚持,那么你会觉得理想不再遥远。致谢永远没有一蹴而就的事情,每一件小事的背后都有不平常发生,这是学校、老师的提醒;永远没有跨不过的山岭丘壑,没一个不称意的背后都会有你战胜它的条件,想一想,在你遭遇挫折时你身后总会有老师、同学的陪伴,这是学校、老师的诚意。在校生活的点点滴滴中,生活看似平凡无常,却会深深的印入你的脑海,就是那一幕幕不经意的画面有时间就会突然闪现在你的脑海,让你精神饱满的笑对生活,让我心存感激。我感激学校给予我学习的热土,让我可以规划人生的奋斗框架,不断丰富自生,完善自己。我感谢学校给予我广交朋友的机会,让我知道不是一

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 教案示例

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁