分治算法实验(用分治法实现归并排序算法).doc

分治算法实验(用分治法实现归并排序算法).doc

  1. 1、本文档共7页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
分治算法实验(用分治法实现归并排序算法)

算法分析与设计实验报告 第 二 次实验 姓名 学号 班级 时间 10.17上午 地点 工训楼309 实验名称 分治算法实验(用分治法实现归并排序算法) 实验目的 通过上机实验,要求掌握分治算法的问题描述、算法设计思想、程序设计。 实验原理 给定任意几组数据,利用分治法的思想,将数据进行排序并将排好的数 据进行输出。 程序思路: (1)简单的将原始序列划分为两个子序列; (2)分别对每一个子序列递归排序; (3)最后将排好序的子序列合并成一个有序序列。 实验步骤 ① 先解决小规模的问题。 ② 将问题分解,将数组分为两个小的数组。 ③ 递归的解各子问题, 将(中分解的两个小的数组再进行以上两个步骤 最后都化为小规模问题。 ④ 将各子问题的解进行合并最终得到原问题的解。 关键代码 void merge(int A[],int B[],int low,int mid,int high) //将两个子序列合并排序成一个有序的序列 { int i=low; int j=mid+1; int k=low; while((i=mid)(j=high)) //两两比较,将较小的数放在临时的数组中 { if(A[i]=A[j]) { B[k++]=A[i++]; } else { B[k++]=A[j++]; } } if(imid) //如果最后左半边子序列已经全部排完,就将右边子序列剩下的元素直接复制到临时的数组中 { for(int last=j;last=high;last++) { B[k++]=A[last]; } } else //如果最后右半边子序列已经全部排完,就将左边子序列剩下的元素直接复制到临时的数组中 { for(int last=i;last=mid;last++) { B[k++]=A[last]; } } } void mergesort(int a[],int b[],int left,int right) //分治法实现归并排序,利用递归实现 { if(leftright) //如果序列中元素超过一个才会进行划分 { int mid=(left+right)/2; //将序列从中位数地方划分为两个子序列 mergesort(a,b,left,mid); // 对左半边子序列递归调用自身,将子序列变成有序 mergesort(a,b,mid+1,right); //对右边子序列递归调用自身,将子序列变成有序 merge(a,b,left,mid,right); //调用合并函数,将子序列合并,实现整个数列的有序 for(int h=left;h=right;h++) //将临时有序的数组复制回原组 { a[h]=b[h]; } } } 没有输出排序序列的结果: 输出排序序列的结果: 实验心得 对于归并排序,在之前的数据结构已经学过了,本来以为代码实现起来会比较简单,可是情况并不是这样的。对于分治法这个算法,我存在的困难主要是我明白分治过程是如何的,但是却很难和代码练习起来,我对于递归过程还是很不清楚,所以代码实现起来还是很困难。不过幸好我之前有提前准备,提前将归并排序仔细的研究过了,所以还是磕磕巴巴的将代码实现,也因为这两个分治法的实验,使我更加深入了解了分治法,对于递归过程也更加明白,相信在自己练习几次之后,能够掌握这个函数。 实验比较 观察上面两个不同的实现方法所花费的时间,我们可以看到,采用非递归的方法实现,所花费的时间比利用分治法花费的时间多,为什么会出现这样的结果,我们可以知道在分治法需要比较的次数比非递归方法多,甚至是多得多,所以它所花费的时间也多,所以对于这种求最大值最小值的问题,利用非递归的方法相对会好一点。 实验得分 助教签名 附录: 完整代码(分治法) #includeiostream #includetime.h #includeiomanip using namespace std; void merge(int A[],int B[],int low,int mid,int high) //将两个子序列合并,排序成一个有序的序列 { int i=low; int j=mid+1; int k=low; while((i=mid)(j=high)) //两两比较将较小的数放在临时的数组中 { if(A[i]=A[j]) { B[k++]=A[i+

文档评论(0)

shuwkb + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档