第十四周第三次总结

分治法思路:

将整个问题分解成若干小问题后再分而治之。如果分解得到的子问题相对来说还是太大,则可反复使用分治策略将这些子问题分成更小的同类型子问题,直至产生方便求解的子问题,必要时逐步合并这些子问题的解,从而得到问题的解。

分治算法可以由递归过程来表示,因为分治法就是一种找大规模问题与小规模问题关系的方法,是递归设计的一种具体策略。

原理

求最大最小问题

下标  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");

}

个人感觉就是多次二分查找。。。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值