分治法求最大值

将数组a[i:j]一分为二,找出前半部分最大值,找出后半部分最大值,总合结果

#include<iostream>
using namespace std;
void findMax(int a[], int i, int j, int &max);
int main(){
int a[100];
int n, i;
while (cin >> n){
for (i = 0; i < n; i++)
cin >> a[i];
int max = a[0];
findMax(a, 0, n - 1,max);
cout << max << endl;
}
}
void findMax(int a[], int i, int j, int &max){
if (j == i){
/*一个元素时候,a[i]为这小组的最大者*/
max = a[i];
}
else if (j == i + 1){
/*找出两个数的最大者*/
max = a[i]>a[j] ? a[i] : a[j];
}
else{
int k = (j - i + 1) / 2;
int max1;
/*分治后递归*/
findMax(a, i, i + k, max);/*a[i:i+k]中最大值*/
findMax(a, i + k + 1, j, max1)/*a[i+k+1:j]中的最大者*/;
max = max1 > max ? max1 : max;/*max保存最大值*/
}
}

原文地址:https://www.cnblogs.com/td15980891505/p/4445816.html