算法_分治策略_找到最大值与最小值

来源:互联网 发布:c#集合和数组的区别 编辑:程序博客网 时间:2024/05/19 15:24
可以用分治算法来解决一个简单的问题。就是从n个元素中找到最大值和最小值。一个最直观的算法是
void StraightMaxMin(Type  a[],int n,Type &max,Type &min){    max = min = a[1];    for(int i = 2; i <= n;i++)    {        if(max < a[i]) max = a[i];        if(min >a[i]) min = a[i];    }}

可以改进一下就是

if(max < a[i]) max = a[i];else    if(min >a[i]) min = a[i];

这样就减少了比较次数 

分治的概率是将问题不断的分解为规模更小,但实际相同的子问题   所以递归调用是符合这种思想的
比如下面这个算法

void MaxMin(int i,int j,Type &Max,Type &Min){    if(i == j) max = min = a[i];    else  if(i = j - 1){        if(a[i]<a[j])         {            Max = a[j];            Min = a[i];        }        else        {            Max = a[j];            Min = a[i];        }    }    else {            //如果p不是最小问题 ,就将它分割成最小问题            int mid = (i + j )/2;Type Max1,Min1;            MaxMin(i,mid,Max1,Min1);            MaxMin(i,mid,Max,Min);            if(Max  < Max1) Max = Max1;            if(Min  > Min) Min = Min;                       }   }

那么问题来了?如何将上面这个递归改成非递归的形式呢?

  计算机算法C++描述

原创粉丝点击