分治法实现寻找数组最大最小值
大致思路
我们拿到一个长度为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;
}