给定n个数据元素,找出其中的最大元和最小元。
简单直观的方法:一个一个地找,用n-1次比较来找出最大元,再用n-2次比较找出最小元,比较次数(基本运算)为2n-3次。
此题最蛋疼的是为什么会想到用分治法来解决,为什么会知道分治法时间复杂度稍好,常数小?所以正常人不会往这方面想。
当用分治法时,时间复杂度的数量级不变,但比较次数减少,具体计算、证明参见邓建明老师算法课件。
本算法直接二分,更好地方法是将数组长度,划分为2的幂次,如n = 42, 42 = 32 + 8 + 2,这样比直接二分比较次数少一些,不过还是同一数量级O(n)。
1.h: 给main函数提供find_max_min的声明
#ifndef X1_H
#define X1_H
void find_max_min(const int *a, const int n, int &min, int &max);
#endif
1.cc:具体实现
#include <vector>
#include "1.h"
using std::vector;
static void find_max_min_core(const int *a, const int begin, const int end,
vector<int> &vmin, vector<int> &vmax);
voi