分治法实现寻找数组最大最小值

分治法实现寻找数组最大最小值

大致思路

我们拿到一个长度为K的一维数组,想要在短时间内进行最大最小值的查找,第一种想法就是现将数组进行排序,这样首末的元素分别是最小和最大的元素。排序算法中,快速排序、归并排序、堆排序等排序算法的时间复杂度都是O(nlogn),第二种想法就是建立堆,但是需要分别建立最小值堆和最大值堆,我们可以采取第三种做法,将整个数组进行一次次的二分,直到二分后的结果只有两个元素,比较取出最小值或者最大值,采用这种分治的方法可以快速有效的寻找到最大值和最小值,时间复杂度为O(logn)
下面是C++的具体实现:

#include <iostream> 
using namespace std;
int least(int* array,int start,int ends){
//前两个条件是递归终止条件。
	if (ends == start){
		return array[start];
	}
	else if (ends - start == 1){
		return (array[start] < array[ends]) ? array[start] : array[ends];
	}
	else{
		int mid = (ends + start) / 2;//开始进行二分,计算这个数组的中间位置
		int left = least(array,start,mid);//分治递归计算左边数组的极值
		int right = least(array,mid,ends);//分治递归计算右边数组的极值
		return (left < right) ? left : right;
		//if ( least(array,start,mid) < least(array,mid,ends) ){
			//return least(array,start,mid);
		//}
		//else{
		//	return least(array,mid,ends);
		//}
	}
} 

int most(int* array,int start,int ends){//与上面的基本相同,更改运算符
	if (ends == start){
		return array[start];
	}
	else if (ends - start == 1){
		return (array[start] > array[ends]) ? array[start] : array[ends];
	}
	else{
		int mid = (ends + start) / 2;
		int left = most(array,start,mid);
		int right = most(array,mid,ends);
		return (left > right) ? left : right;
		//if ( least(array,start,mid) > least(array,mid,ends) ){
		//	return least(array,start,mid);
		//}
		//else{
		//	return least(array,mid,ends);
		//}
	}
} 

int main(){
	int length;
	cin >> length;
	int array[length];
	for (int i = 0;i < length; i++){
		cin >> array[i];
	} 
	int max = most(array,0,length-1);
	int min = least(array,0,length-1);
	cout << "The max is "<< max << "\n";
	cout << "The min is "<< min << "\n";
	return 0;
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值