给定N个数,求取其最大最小值,要求尽可能的快

来源:互联网 发布:安娜贝尔 知乎 编辑:程序博客网 时间:2024/05/01 04:32
对于N个数的话,按照常规思路需要比较N-1次,然而T(2)=1,所以这里可以使用分治递归的方法
1. 将N个数等分为左边部分和右边部分 left right middle = (left + right)/2   [left midle] 与[left+1 right]
2. 分别求取左边最大,最小值和右边最大最小值
3. 合并左右最大值和左右最小值

代码
//算法
void minmax(int * a, int lint rint & min int max)
{
                 int minl, minr, maxl, maxr;
                 if (r == l) { max = min = a[1]; }
                 else if ( r == l + 1) {
                                 if (a [ l] > a [r ]){
                                                 min a [ r]; max = a[ l];
                                }
                                 else {
                                                 min a [ l]; max = a[ r];
                                }
                }
                 else {
                                 int m = (l r) / 2;
                                minmax( a l , m, minl,maxl);
                                minmax( a , m+1, r , minr, maxr);
                                 max = maxl > maxr ? maxl : maxr;
                                 min = minl < minr ? minl : minr;
                }
}
//测试
int main()
{
                 int a[9] = {9,4,5,3,7,8,2,1,6};
                 int min, max;
                minmax(a, 0, 8, min, max);
                cout << min << endl;
                cout << max << endl;

                cin.ignore(1);
                 return 0;
}
0 0
原创粉丝点击