数据结构中归并排序的设计与实现

上传人:枫** 文档编号:544363967 上传时间:2022-08-10 格式:DOC 页数:19 大小:159KB
返回 下载 相关 举报
数据结构中归并排序的设计与实现_第1页
第1页 / 共19页
数据结构中归并排序的设计与实现_第2页
第2页 / 共19页
数据结构中归并排序的设计与实现_第3页
第3页 / 共19页
数据结构中归并排序的设计与实现_第4页
第4页 / 共19页
数据结构中归并排序的设计与实现_第5页
第5页 / 共19页
点击查看更多>>
资源描述

《数据结构中归并排序的设计与实现》由会员分享,可在线阅读,更多相关《数据结构中归并排序的设计与实现(19页珍藏版)》请在金锄头文库上搜索。

1、课程设计任务书学生姓名: 专业班级: 指导教师: 工作单位:题 目: 归并排序的设计与实现初始条件:理论:学习了数据结构课程,掌握了基本的数据结构和常用的算法;实践:计算机技术系实验室提供计算机及软件开发环境。要求完成的主要任务: (包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1、系统应具备的功能:(1)输入一组数,用递归和非递归程序实现归并排序(2)分析归并排序的复杂度(3)将归并排序的思想用于外部排序中2、数据结构设计;3、主要算法设计;4、编程及上机实现;5、撰写课程设计报告,包括:(1)设计题目;(2)摘要和关键字(中文和英文);(3)正文,包括引言、需求分析、数据结构设

2、计、算法设计、程序实现及测试、设计体会等;(4)结束语;(5)参考文献。时间安排: 2010年元月10日14日 (第19周) 元月10日 查阅资料元月11日 系统设计,数据结构设计,算法设计元月12日-13日 编程并上机调试元月14日 撰写报告元月15日 验收程序,提交设计报告书。指导教师签名: 2010年元月10日 系主任(或责任教师)签名: 2010年元月10日 归并排序的设计和实现摘要:该程序主要由五个部分组成:把一组待排的数据信息放在结构体里,2路归并排序,对数组作一趟归并排序,对数组作归并排序,主函数 。Abstract: The program mainly consists of

3、 five parts: the a row of data to be placed on structure, the 2 - way merge sort, for a trip to the arrayMerge sort, merge sort on the array as the main function.关键字:模型化, 2路归并, 一趟归并, 归并Keywords: modeling, 2 - way merge, a trip to merge, merge 0.引言归并排序是一种稳定的内部排序,“归并”的含义是将两个或两个以上的有序表组合成一个新的有序表。无论是顺序存储

4、结构还是链表存储结构,都可在O(m+n)的时间量级上实现。利用归并的思想容易实现排序。2路归并排序:假设初始序列含有n个记录,则可看成是n个有序的子序列,每个子序列的长度为1,然后两两归并,得到不小于n/2整数个长度为2或1的有序子序列;再两两归并,如此重复,直至得到一个长度为n的有序序列为止。1.算法把握 1.1归并排序算法的具体分析咋一看,归并排序时一种“费力不讨好”的排序方法,因为最后一趟始终要对整个序列进行排序,这会使的前几趟的排序似乎是在做无用功,其实不然。对初始关键字两两分组并进行组内排序后,在下一次处理中,并不是简单地在组容量扩大一倍的基础上重新排序,而是把上一趟已经排好序的两组

5、数组重新合并成一个新的有序组。这个把两个有序组合并到一个新的有序组的过程要比单独排序快得多。归并排序的核心操作时合并有序组。对于最开始的两两分组,也可以看成是两个只含有1个关键字的组进行合并。1.2 除了核心的合并操作外,需要先把序列进行分组,每次组容量减半,直到组内只有一个关键字为止,再对组进行合并,直到所有关键字都属于一组为止。实际上,分组采用递归的方法更加方便。2.需求分析(1)通过建立一个结构体,用来存放数据信息,包括数据的个数,本身记录。(2)2路归并排序的算法,实现两两归并。(3)主函数初始化数据,选择归并排序的方法及打印数据结果。3.数据结构设计用结构体存储待排的数据。#incl

6、ude#define MAX 100 /*定义MAX是最大的允许输入数字个数*/typedef struct int n; /* n为文件中的记录个数,nMAXNUM */ int dataMAX;lqlist;4.算法设计4.1 2-路归并排序的非递归算法 /将有序的SRi.m和SRm+1.n归并为有序的TRi.n void merge(RcdType SR,RcdType&TR,int i,int m,int n) for(j=m+1,k=I;i=m&j=n;k+) /将SR中记录由小到大的并入TR if(LQ(SRi.key,SRj.key) TRk=SRi+; else TRk=SRj

7、+; if(i=m) TRk.n=SRi.m; /将剩余的SRi.m复制到TR if(j=n) TRk.n=SRj.n; /将剩余的SRi.m复制到TR/merge4.2 2-路归并排序的递归形式 void Msort(RcdType SR,RcdType&TR1,int s,int t) /将SR归并排序为TR if(s=t) TR1s=SRs;else m=(s+t)/2; /将平分为SRs.t和SRm+1.t Msort(SR,TR2,s,m); / 递归的将SRs.m归并为有序的TR2s.m Msort(SR,TR2,m+1,t); /递归地将SRm+1.t归并为有序的TRm+1.tM

8、erge(TR2,TR1,s,m,t); / 将TR2s.m和TR2m+1.t归并到TR1s.t/mergesort4.3 对顺序表L作归并排序Void mergesort(SqList &L) Msort(L.r,L.r,1,L.length);/mergesort4.4 非递归形式归并算法void merge(int r, int r1, int low, int m, int high) /* rlow到rm和rm+1到rright是两个有序段 */ int i = low, j = m + 1, k = low; while ( i = m & j = high ) /* 反复复制两个

9、段的第一个记录中较小的 */ if (ri = rj ) r1k+ = ri+; else r1k+ = rj+; while (i = m) r1k+ = ri+; /* 复制第一个段的剩余记录 */ while (j = high) r1k+ = rj+;/* 复制第二个段的剩余记录 */4.5 对 r 做一趟归并的算法 void mergePass(int r, int r1, int n, int length) int i = 0, j; /* length为本趟归并的有序子段的长度 */while(i + 2*length - 1 n) /* 归并长length的两个子段*/mer

10、ge(r, r1, i, i+length-1, i + 2*length - 1); i += 2*length; if(i + length - 1 n - 1) /* 剩下两段,后一段长度小于 length */ merge(r, r1, i, i+length-1, n-1); else /* 将剩下的一段复制到数组r1 */ for(j = i; j n; j+) r1j = rj;4.6 对整个数据进行归并的算法void mergeSort(SortObject * p ) int dataMAXNUM; int length = 1; while (length n) /* 一趟

11、归并,结果存放在数组record中*/ mergePass(p-record, record, p-n, length); length *= 2; /* 一趟归并,结果存回 */ mergePass(record, p-record, p-n, length); length *= 2; 4.7 主程序main()cout*endl;cout 归并排序的递归和非递归实现 endl;cout*endl;lqlist p;int i=0,z,m,k;cout 请输入所要比较的数字组,以10000结束: z;while(z!=10000&iz;p.n =i;cout排序前的数组是:endl;for(i=0;ip.n ;i+)coutp.data i ;cout请选择需要归并排序的方法endl1.选择递归方法。endl;cout2.选择非递归方法。m;if(m=1)M(&p);else if(m=2) mergesort2(&p);else cout输入有误。endl; coutendl排序后的数组:endl;for(i=0;ip.n ;i+) /*输出排序前的数组*/coutp.datai ;coutendl;cout请选择服务:endl; if(m=1) cout1.选择非递归方法。endl; elsecout1.选择递归方法。

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

当前位置:首页 > 建筑/环境 > 施工组织

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号