分治法-求最大最小元
2012-04-07 13:16
218 查看
用分治法求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; */
相关文章推荐
- 分治法 求最大元和最小元 Java语言
- 分治法寻找数组最大的两个数和最小的两个数
- 求最大最小元 C++实现 分治法
- Java 分治法 求解一组数组元素的最大值和最小值
- 分治法求最大最小元问题
- 分治法求数组的最小值和最大值
- 分治法求数组的最大值和最小值
- 分治法——查找最大最小元素(Python)
- 分治法求最大最小元素
- 基础算法 分治法求最大最小元
- 用分治法,二分求出数组的最大值和最小值
- 分治法解最大最小问题
- 【分治法】求数组最大值和最小值(js版)
- 分治法求最大最小元
- 计算最大值和最小值(分治法)
- 【分治法】求数组的最大元和最小元
- 分治法求数组中的最大最小元素
- 分治法求最大数最小数问题
- 算法笔记04--分治法之寻找最大最小元素
- Java 分治法求数组的最小最大值