- 1、本文档共7页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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])
{
文档评论(0)