分治法思路:
将整个问题分解成若干小问题后再分而治之。如果分解得到的子问题相对来说还是太大,则可反复使用分治策略将这些子问题分成更小的同类型子问题,直至产生方便求解的子问题,必要时逐步合并这些子问题的解,从而得到问题的解。
分治算法可以由递归过程来表示,因为分治法就是一种找大规模问题与小规模问题关系的方法,是递归设计的一种具体策略。
原理
求最大最小问题
下标 0 1 2 3 4 5 6 7 8
8 3 6 2 1 9 4 7 5
先把这个序列一分为二
序列 一 8 3 6 2 1 序列二 9 4 7 5
如果说我们解决了最大最小问题
最大x1 最小y1 最大x2最大y2
最后我们在x1与x2中找最大值,在y1和y2中找最小值
我们为了解决序列一与序列二的最大最小值问题,我们还在一分为二(递归),
序列三 8 3 6 序列四 2 1 序列五 9 4 序列六 7 5
为了解决序列……的问题,我们就还要一分为二(继续递归)
序列七 8 3 序列八 6
分的足够小后
如序列七 8 3 其中最大值为 8 最小值为 3
如序列八 6 其中最大值最小值都是 6
之后
序列三的最大值 就是8 与6进行比较
最小值 就是 3
序列四 的最大值就是2 最小值就是 1
序列一的最大值为 8
最小值为 1
依次类推
序列二的最大值为 9
最小值为 4
最后的到结果 最大值为 9 最小值为 1
(伪)代码实例
void maxmin(int A[],int max[],int min[],int low,int high)
{
int mid,x1,x2,y1,y2;
if((high-low)<=1)//也就是序列的大小为2
{
if(A[high]>A[low])
{
max=A[high];
min=A[low];
}
else
{
max=A[low];
max=A[high];
}
}
else
{
mid=(high+low)/2;
maxmin(A,x1,y1,low,mid);
maxmin(A,x2,y2,mid+1,high);
max=max(x1,x2);
min=min(y1,y2);
}
}
问题 I: 分治法求最大值和最小值
题目描述
给定若干个整数,要求使用分治算法求出最大值和最小值。
输入
输入只包括若干个用例,每个用例占两行,第一行为整数个数n(1<=n<=100)。第二行为n个整数
输出
每个用例用一行输出其最小值和最大值,用空格隔开。
样例输入 复制
2
5
9 5 7 3 10
10
1 2 3 6 5 4 7 8 9 0
样例输出 复制
3 10
0 9
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void maxmin(int arr[], int*max, int*min, int low, int high)
{
int mid, x1=0, x2=0, y1=0, y2=0;
if ((high - low) <= 1)
{
if (arr[high]>arr[low])
{
*max = arr[high];
*min = arr[low];
}
else
{
*max = arr[low];
*min = arr[high];
}
}
else
{
mid = (high + low) / 2;
maxmin(arr, &x1, &y1, low, mid);
maxmin(arr, &x2, &y2, mid + 1, high);
if (x1>x2)
*max = x1;
else
*max = x2;
if (y1<y2)
*min = y1;
else
*min = y2;
}
}
int main()
{
int a = 0;
scanf_s("%d", &a);
while (a--)
{
int n, arr[110], x1 = 0, y1 = 0;
scanf_s("%d", &n);
for (int i = 0; i<n; i++)
scanf_s("%d", &arr[i]);
maxmin(arr, &x1, &y1, 0, n - 1);//要使用指针来
printf("%d %d\n", y1, x1);
}
system("pause");
}
个人感觉就是多次二分查找。。。