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

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

大致思路

我们拿到一个长度为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;
}
  • 5
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是使用分治法寻找数组最大值和最小值C语言代码: ``` #include <stdio.h> struct Result { int max; int min; }; struct Result findMinMax(int arr[], int startIndex, int endIndex) { struct Result result; int mid; // 如果只有一个元素,那么最大值和最小值都是它本身 if (startIndex == endIndex) { result.max = arr[startIndex]; result.min = arr[startIndex]; return result; } // 如果只有两个元素,比较它们的大小得到最大值和最小值 if (endIndex == startIndex + 1) { if (arr[startIndex] > arr[endIndex]) { result.max = arr[startIndex]; result.min = arr[endIndex]; } else { result.max = arr[endIndex]; result.min = arr[startIndex]; } return result; } // 如果有超过两个元素,分治思想递归处理左右两个子数组 mid = (startIndex + endIndex) / 2; struct Result leftResult = findMinMax(arr, startIndex, mid); struct Result rightResult = findMinMax(arr, mid + 1, endIndex); // 取左右两个子数组最大值和最小值 if (leftResult.max > rightResult.max) { result.max = leftResult.max; } else { result.max = rightResult.max; } if (leftResult.min < rightResult.min) { result.min = leftResult.min; } else { result.min = rightResult.min; } return result; } int main() { int arr[] = {10, 4, 3, 7, 5, 6, 2, 1, 9, 8}; int arrSize = sizeof(arr) / sizeof(arr[0]); struct Result result = findMinMax(arr, 0, arrSize - 1); printf("The max element is %d\n", result.max); printf("The min element is %d\n", result.min); return 0; } ``` 请注意,如果您有其他的技术问题,随时可以问我,我会尽我所能帮您解答。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值