用分治法求n个元素集合S中的最大、最小元素(要求每次平分成2个子集)
void maxmin(int A[], int &e_max, int &e_min ,int low, int high)
{
int mid, x1, y1, x2, y2;
if (high - low <= 1) { //<=,可能为1个
if (A[high] > A[low]) {
e_max = A[high];
e_min = A[low];
}
else {
e_max = A[low];
e_min = A[high];
}
} //特征1:小到容易求解
else {
mid = (low + high) / 2; //特征2:可分解
maxmin(A, x1, y1, low, mid); //特征4:子问题独立
maxmin(A, x2, y2, mid + 1, high);
e_max = max(x1, x2); //特征3:可合并
e_min = min(y1, y2);
}
}
分析如下
#include <stdio.h> #include<stdlib.h> int max(int a, int b) { return (a > b) ? a : b; } int min(int a, int b) { return (a < b) ? a : b; } void maxmin(int A[], int &e_max, int &e_min ,int low, int high) { int mid, x1, y1, x2, y2; if (high - low <= 1) { //<=,可能为1个 if (A[high] > A[low]) { e_max = A[high]; e_min = A[low]; } else { e_max = A[low]; e_min = A[high]; } } //特征1:小到容易求解 else { mid= (low + high) / 2; //特征2:可分解 maxmin(A, x1, y1, low, mid); //特征4:子问题独立 maxmin(A, x2, y2, mid + 1, high); e_max = max(x1, x2); //特征3:可合并 e_min = min(y1, y2); } } int main() { int init[11], max, min; for(int i = 1; i <= 10; i ++){ scanf("%d", &init[i]); } maxmin(init, max, min, 1, 10); printf("%d %d", max, min); system("pause"); } /* (0 1 3 5 2 4 6 8 9 7),ENTER LEVEL ONE 1 5 ENTER LEVEL TWO 1 3 ENTER LEVEL THREE 1 2 ENTER LEVEL FOUR e_max = 1; e_min = 0; 1 2 EXIT LEVEL FOUR x1 = 1; y1 = 0; 3 e_max = e_min =3; 3 EXIT LEVEL FOUR x2 = y2 = 3; e_max = 3; -> x1; e_min = 0; -> y1; 1 3 EXIT LEVEL THREE x1 = 1; y1 = 3; 4 5 ENTER LEVEL THREE x2 = 5; y2 = 2; e_max = 5; -> x1; e_min = 0; -> y1; 4 5 EXIT LEVEL THREE x2 = 5; y2 = 2; e_max = 5; e_min = 0; 1 5 EXIT LEVEL TWO x1 = 5; y1 = 0; 6 10 ENTER LEVEL TWO 6 8 ENTER LEVEL THREE 6 7 ENTER LEVEL FOUR e_max = 6; e_min = 4; 6 7 EXIT LEVEL FOUR x1 = 6; y1 = 4; 8 ENTER LEVEL FOUR e_max = e_min = 8; 8 EXIT LEVEL FOUR x2 = y2 = 8; e_max = 8; e_min = 4; 6 8 EXIT LEVEL THREE x1 = 8; y1 = 4; 9 10 ENTER LEVEL THREE e_max = 9; e_min = 7; 9 10 EXIT LEVEL THREE x2 = 9; y2 = 7; 6 10 EXIT LEVEL TWO x2 = 9; y2 = 4; e_max = 9; e_min = 0; 1 10 EXIT LEVEL ONE e_max = 9; e_min = 0; */