算法系列——用分治法求最大最小值
1、方法思想
使用分治法的思想:首先把数组分成两部分,在把这两部分中的每一部分分成两部分,一直递归分解直到每一部分小于等于2个数为止,然后比较这两个数,判断最大最小值,然后回弹比较直到递归的最外层,就可以判断最大最小值;
2、问题描述
从一个无序的数列中查找最大值和最小值
3、算法描述
(1)采用分治的思想来描叙问题;
(2)伪代码:
FindMaxAndMin(a[],begin,end,pmax,pmin)
If end-begin<=1
Then pmax=a[begin]
pmin=a[end]
else pmax=a[end]
pmin=a[begin]
else mid=(begin+end)/2
FindMaxAndMin(a[],begin,mid,pmax,pmin);
FindMaxAndMin(a[],mid+1,end,pmax,pmin);
Pmax=max{gmax,hmax}
Pmin=min{gmin,hmin}
4、程序清单
1 #include <iostream>
2 using namespace std;
3
4 void FindMaxAndMin(int a[], int begin, int end, int* pmax, int* pmin)
5 {
6 if(end-begin <=1)
7 {
8 if(a[begin] <= a[end])
9 {
10 *pmax = a[end];
11 *pmin = a[begin];
12 return;
13 }
14 else
15 {
16 *pmin = a[end];
17 *pmax = a[begin];
18 return;
19 }
20 }
21
22 int min1, min2, max1, max2;
23 int mid = (begin+end)/2;
24 FindMaxAndMin(a, begin, mid, &max1, &min1);
25 FindMaxAndMin(a, mid+1, end, &max2, &min2);
26 *pmin = min1 < min2 ? min1 : min2;
27 *pmax = max1 < max2 ? max2 : max1;
28 }
29
30 int main()
31 {
32 int a[] = {1,2,3,4,5,9,41,8,12,20,98};
33 int max, min;
34 FindMaxAndMin(a, 0, 10, &max, &min);
35 cout<<"the max num is:"<<max<<", the min num is:"<<min<<endl;
36 return 0;
37 }
5、实验结果
(可用文字描述和贴图等方式表现实验结果)
输入为:a[] = {1,2,3,4,5,9,41,8,12,20,98};
输出为:
(大二的时候写的,可能还有些问题,请见谅、、、)
多聚旅游 聚游宝 学友网