前面我们已经了解了分治法的原理和使用,分治法的经典问题——大整数相乘,趁热打铁,来学习一下如何使用分治法来求数列中的最大最小值。
利用分治法来分析
伪代码
时间复杂性
代码实现
#include<cstdio>
#include<cstdlib>
#include<cmath>
using namespace std;
int* getmaxmin(
int a,
int b){
int* m =
new int[
2];
if(a < b){
m[
0] = a;
m[
1] = b;
}
else{
m[
0] = b;
m[
1] = a;
}
printf(
"getmaxmin的值:%d, %d\n", m[
0], m[
1]);
return m;
}
int* maxmin(
int a[],
int n1,
int n2){
if((n2 - n1 +
1)==
1){
int* m =
new int[
2];
m[
0] = -
1;
m[
1] = a[n2];
return getmaxmin(a[n2], a[n2]);
}
else if((n2 - n1 +
1) ==
2){
return getmaxmin(a[n1], a[n2]);
}
else{
int k = n1 + (n2 - n1) /
2;
int* lm = maxmin(a, n1, k);
int* rm = maxmin(a, k+
1, n2);
printf(
"lm得到的值:%d, %d\n", lm[
0], lm[
1]);
if(rm[
0] == -
1){
printf(
"rm得到的值:%d\n", rm[
1]);
}
printf(
"rm得到的值:%d, %d\n", rm[
0], rm[
1]);
int* result =
new int[
2];
if(lm[
0] < rm[
0]){
result[
0] = lm[
0];
}
else{
result[
0] = rm[
0];
}
if(lm[
1] < rm[
1]){
result[
1] = rm[
1];
}
else{
result[
1] = lm[
1];
}
return result;
}
}
int main(){
int a[
8] = {
6,
10,
32,
8,
19,
20,
2,
14};
int* result = maxmin(a,
0,
7);
printf(
"最大值为:%d,最小值为:%d", result[
1], result[
0]);
}
结果如下:
转载请注明原文地址: https://ju.6miu.com/read-971362.html