算法实验-分治法查找最大最小值

实验原理

利用分治法查找数组元素的最大值与最小值。并计算出程序运行所需要的时间。

实验步骤

①将问题分解,如果数组中只有一个元素,那么只需要比较该元素与当前的最大值最小值并进行更新即可
②将问题扩大,数组中有多个元素,则可以通过套用二分法进行拆分,递归将整个数组拆分为多个只有一个元素的小数组,即分解为多个1问题
③最后将每一个小数组得到的结果进行比较,选取其中的最大值和最小值对存储最大值最小值的变量进行更新

关键代码

template<class type>//为了对任何类型进行比较,实际上只需要为int
int BS(type a[],int left,int right,int & max,int & min){//第一个元素为数组,每次对数组的left和right进行更新,直到二者相等,即当前数组中只有一个元素;max和min为存储最大值和最小值的变量,必须为指针或者引用
	int middle,max1,max2,min1,min2;
	if(left==right){		
		max=a[left];
		min=a[left];	
	}else{
		middle=(left+right)/2;	
		BS(a,middle+1,right,max1,min1);
		BS(a,left,middle,max2,min2);
		if(min1>min2) min=min2;
		else min=min1;
		if(max2>max1) max=max2;
		else max=max1;
	}
}
通过代码可以看出时间复杂度近似为nlogn

完整代码

#include <iostream>
#include <fstream>
#include <windows.h> 
using namespace std;
template<class type>
int BS(type a[],int left,int right,int & max,int & min);
int main()
{
	ofstream out;
	out.open("output.txt");
	ifstream in;
	in.open("input.txt");
	int n;
	in>>n;
	int a[n];
	for(int i=0;i<n;i++){
		in>>a[i];
	} 
	int max=a[0];
	int min=max;
	LARGE_INTEGER time,time0,time1,time2;
	QueryPerformanceFrequency(&time);
	QueryPerformanceCounter(&time0);
	BS(a,0,n-1,max,min);
	QueryPerformanceCounter(&time1);
	out<<"最大值为:"<<max<<" 最小值为:"<<min<<"时间为:"<<1000.0*(time1.QuadPart-time0.QuadPart)/time.QuadPart<<"ms"<<endl;
	return 0;
}
template<class type>
int BS(type a[],int left,int right,int & max,int & min){
	int middle,max1,max2,min1,min2;
	if(left==right){		
		max=a[left];
		min=a[left];	
	}else{
		middle=(left+right)/2;	
		BS(a,middle+1,right,max1,min1);
		BS(a,left,middle,max2,min2);
		if(min1>min2)
			min=min2;
		else
			min=min1;
		if(max2>max1)
			max=max2;
		else
			max=max1;
	}
}
//	}
//	if(right==left+1){
//		if(a[right]>a[left]){
//			min=a[left];
//			max=a[right];
//		}else{
//			min=a[right];
//			max=a[left];
//		}
算法实验-分治法查找最大最小值算法实验-分治法查找最大最小值 HNU君陌 发布了217 篇原创文章 · 获赞 128 · 访问量 3万+ 私信 关注
上一篇:bs模态框中的form获取或设置表单及其中元素用nam不能用id?


下一篇:《前端》Bootstrap模态框(Modal)插件