算法系列——用分治法求最大最小值

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};

输出为:

(大二的时候写的,可能还有些问题,请见谅、、、)

posted @ 2011-10-24 23:35  三度空间  阅读(6940)  评论(0编辑  收藏  举报