1、算法分析与设计实验报告第 一 次实验姓名 学号 班级时间 10.17 上午 地点 工训楼 309实验名称 分治算法实验(用分治法查找数组元素的最大值和最小值)实验目的 通过上机实验,要求掌握分治算法的问题描述、算法设计思想、程序设计。实验原理使用分治的算法,根据不同的输入用例,能准确的输出用例中的最大值与最小值。并计算出程序运行所需要的时间。程序思路:利用分治法,将一个数组元素大于 2 的数组分成两个子数组,然后对每一个子数组递归调用,直到最小的子数组的元素个数为 1 个或者是 2个,此时直接就能得出最大值与最小值,然后合并子数组,比较 2 个子数组的最大值与最小值,依次进行下去,知道找到整个
2、数组的最大值与最小值。实验步骤1. 先解决小规模的问题, 如数组中只有 1 个元素或者只有两个元素时候 的情况。2. 将问题分解,如果数组的元素大于等于 3 个,将数组分为两个小的数 组。3. 递归的解各子问题,将中分解的两个小的数组再进行以上两个步骤最后都化为小规模问题。4. 将各子问题的解进行比较最终得到原问题的解。关键代码/分治法处理整个数组,求出最大值与最小值void merge(int a,int left,int right,int if(right-left2) /当数组中元素个数大于3时,才实行分治法int mid=(right+left)/2;merge(a,left,mid
3、,max1,min1); /左半边递归调用自身,求出最大值与最小值,分别保存在max1,min1中merge(a,mid+1,right,max2,min2);/右半边递归调用自身,求出最大值与最小值,分别保存在max2,min2中if(max1=max2)Max=max1; /子序列两两合并,求出最大值与最小值elseMax=max2; /分别保存在Max与Minif(min1#include#includeusing namespace std;/当数组中的元素个数小于3时,处理最大值int compmax(int A,int start,int end)int max;if(start2
4、) /当数组中元素个数大于等于3时,进行分治int mid=(right+left)/2;merge(a,left,mid,max1,min1); /左半边递归调用自身,求出最大值最小值,分别保存在max1,min1中merge(a,mid+1,right,max2,min2); /右半边递归调用自身,求出最大值最小值,分别保存在max2,min2中if(max1=max2) /子序列两两合并,求出最大值与最小值,保存在Max与Min中Max=max1;elseMax=max2;if(min1n;ran(a,n);clock_t start,end,over; /计算程序运行时间的算法star
5、t=clock();end=clock();over=end-start;start=clock();merge(a,0,n-1,max,min); /调用分治法算法cout#include#includeusing namespace std;void ran(int *input,int n) /随机生成数组元素函数int i;srand(time(0);for(i=0;in;ran(a,n);clock_t start,end,over; /计算程序运行时间的算法start=clock();end=clock();over=end-start;start=clock();for(i=1;imax)max=ai;if(aimin)min=ai;coutmax“ “minendl;end=clock();printf(“The time is %6.3f“,(double)(end-start-over)/CLK_TCK); /显示运行时间system(“pause“);return 0;