#include <iostream> using namespace std; /*查找数组最大值最小值:时间复杂度最多为:o(3n/2)*/ /*基本思想: 当n=2k+1,将让max和min都等于第一个元素,让后将剩余的元素两两比较,将大值再与max比较,如果最大值大于max,则让max等与该最大值, 将两个数中的小值再与min比较,若小于min,则让min等于该小值。 假定n=2k,设置最大值和最小值为第一、二个元素,即Max=A[0],Min=A=[1];将n个数据按2个一组进行分组,n/2组数各自进行比较得到较大值P和较小值q;将Max、Min分别和每组中的较大值、较小值比较,若Max>p,则Max=p;同理,若Min<q,则Min=q;如此循环n/2次即可。 每组比较三次,一共比较n/2次,复杂度为o(3n/2) */ void MaxMin(int arr[], int n, int &max, int &min) { int i; /*元素个数为基数时*/ if (n%2 == 1) { max = min = arr[0]; for (i=1; i<n; i+=2) { if (arr[i] > arr[i+1]) { max = (arr[i] > max) ? arr[i] : max; min = (arr[i+1] < min) ? arr[i+1] : min; } else { max = (arr[i+1] > max) ? arr[i+1] : max; min = (arr[i] < min) ? arr[i] : min; } } } else /*偶数情况*/ { max = (arr[0] > arr[1]) ? arr[0] : arr[1]; min = (arr[0] < arr[1]) ? arr[1] : arr[0]; for (i=2; i<n; i+=2) { if (arr[i] > arr[i+1]) { max = (arr[i] > max) ? arr[i] : max; min = (arr[i+1] < min) ? arr[i+1] : min; } else { max = (arr[i+1] > max) ? arr[i+1] : max; min = (arr[i] < min) ? arr[i] : min; } } } } int main() { int arr[] = {2, 3, 54, 6, 0, 5, 1, -3}; int size = sizeof(arr) / sizeof(int); int max, min; MaxMin(arr, size, max, min); cout<<max<<" "<<min<<endl; } #include <iostream> using namespace std; //函数功能:递归求数组的最大元素和最小元素 //参数:arr为数组,low为下标,high最后一个元素的后一个位置, void MaxMin(int arr[], int low, int high, int& max, int &min); int main() { int arr[] = {1, 2, 3, 4, 5}; int n = sizeof(arr) / sizeof(int); int max, min; MaxMin(arr, 0, n, max, min); cout<<"max = "<<max<<endl; cout<<"min = "<<min<<endl; return 0; } void MaxMin(int arr[], int low, int high, int& max, int &min) { if(low == high - 1) //一个元素 max = min = arr[low]; else if(low == high -2)//两个元素 { if(arr[low] > arr[low + 1]) { max = arr[low]; min = arr[low + 1]; } else { max = arr[low + 1]; min = arr[low]; } } else //进行递归 { int mid = (low + high) / 2; int max1 = 0; int min1 = 0; MaxMin(arr, low, mid, max, min); MaxMin(arr, mid, high, max1, min1); if(max1 > max) max = max1; if(min1 < min) min = min1; } }