分治算法实验(用分治法实现归并排序算法).doc
《分治算法实验(用分治法实现归并排序算法).doc》由会员分享,可在线阅读,更多相关《分治算法实验(用分治法实现归并排序算法).doc(7页珍藏版)》请在三一办公上搜索。
1、算法分析与设计实验报告第 二 次实验姓名学号班级时间10.17上午地点工训楼309 实验名称分治算法实验(用分治法实现归并排序算法)实验目的通过上机实验,要求掌握分治算法的问题描述、算法设计思想、程序设计。实验原理给定任意几组数据,利用分治法的思想,将数据进行排序并将排好的数 据进行输出。程序思路:(1)简单的将原始序列划分为两个子序列;(2)分别对每一个子序列递归排序;(3)最后将排好序的子序列合并成一个有序序列。实验步骤 先解决小规模的问题。 将问题分解,将数组分为两个小的数组。 递归的解各子问题, 将中分解的两个小的数组再进行以上两个步骤最后都化为小规模问题。 将各子问题的解进行合并最终
2、得到原问题的解。关键代码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(Aimid) /如果最后左半边子序列已经全部排完,就将右边子序列剩下的元素直接复制到临时的数组中for(int last=j;last=high;last+)Bk+=Alast;else /如果最后右半边子序列已经全部排完,就将左边子序列剩下的元素直接复制到临时的数组中for(int l
3、ast=i;last=mid;last+)Bk+=Alast;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); /调用合并
4、函数,将子序列合并,实现整个数列的有序for(int h=left;h=right;h+) /将临时有序的数组复制回原数组ah=bh;测试结果没有输出排序序列的结果: 输出排序序列的结果:实验心得对于归并排序,在之前的数据结构已经学过了,本来以为代码实现起来会比较简单,可是情况并不是这样的。对于分治法这个算法,我存在的困难主要是我明白分治过程是如何的,但是却很难和代码练习起来,我对于递归过程还是很不清楚,所以代码实现起来还是很困难。不过幸好我之前有提前准备,提前将归并排序仔细的研究过了,所以还是磕磕巴巴的将代码实现,也因为这两个分治法的实验,使我更加深入了解了分治法,对于递归过程也更加明白,相
5、信在自己练习几次之后,能够掌握这个函数。实验比较观察上面两个不同的实现方法所花费的时间,我们可以看到,采用非递归的方法实现,所花费的时间比利用分治法花费的时间多,为什么会出现这样的结果,我们可以知道在分治法需要比较的次数比非递归方法多,甚至是多得多,所以它所花费的时间也多,所以对于这种求最大值最小值的问题,利用非递归的方法相对会好一点。实验得分助教签名附录:完整代码(分治法)#include#include#includeusing namespace std;void merge(int A,int B,int low,int mid,int high) /将两个子序列合并,排序成一个有序的
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 分治 算法 实验 实现 归并 排序
链接地址:https://www.31ppt.com/p-2396613.html