题目及代码来源:《数据结构习题解析(第三版)》,邓俊辉编著,ISBN: 978-7-302-33065-3
题目要求:从n个整数中找出最大者
//从n个整数中找出最大者
#include<iostream>
#define UPPER 1000
using namespace::std;
int max(int m,int A) {
return (m > A) ? m : A;
}
int maxI(int A[], int n) { //迭代版
int m = INT_MIN; //最大化初始值记录,O(1)
for (int i = 0; i < n; ++i) //对全部共O(n)个元素,逐一
m = max(m, A[i]); //比较并更新,O(1)
return m; //返回最大值,O(1)
}//O(1) + O(n) * O(1) + O(1) = O(n + 2) = O(n)
int maxR(int A[], int n) { //递归版
if (2 > n) //平凡情况,递归基
return A[n - 1]; //直接(非递归式)计算
else //一般情况
return max(maxR(A, n - 1), A[n - 1]); //递归:在前n-1项中的最大值与第n-1项之间,取大者
}//O(1) * 递归深度 = O(1) * O(n + 1) = O(n)
int maxR(int A[], int lo, int hi) {//计算数组区间A[lo,hi)的最大值(二分递归)
if (lo + 1 == hi) //如遇递归基(区间长度降至1),则
return A[lo]; //直接返回该元素
else { //否则,一般情况下,lo + 1 < hi,则
int mi = (lo + hi) >> 1; //以中位单元为界将原区间一分为二:A[lo,mi)和A[mi,hi)
return max(maxR(A, lo, mi), maxR(A, mi, hi)); //递归地计算子区间的最大值,在从中取最大者
}
}//O(hi - lo),线性正比于区间的长度
int main() {
//主函数略
}