加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

分治法求数组中最大和最小的元素

(2010-10-22 16:45:06)
标签:

杂谈

分类: 数据结构
分治法

对于一个规模为n的问,若该问题可以容易地解决(比如说规模n)则直接解决,

否则将其解为k个规较小的子题,这些问题互相立且与原题形式相,递归地 解这些子问题,然后将各子问题的解合并得到原问题的解。这种算法设计策略叫做分治法

数组 a[0, n-1] 输出a 最大与最小元素 代码:

public IntPair simpleMinMax (int[] a){ IntPair pair = new IntPair();

pair.x = a[0];

pair.y = a[0];

for (int i=1; i<a.length; i++){

if (pair.x<a[i]) pair.x = a[i];

if (pair.y>a[i]) pair.y = a[i];

}

return pair;

}


private class IntPair{

int x;

int y;

}

 

 

算法 5-5 共要进行 2n-2 次比较。 然而另外一种解决这个问题的方法是使用分治法可以把数组 a 分成小相等的两个数

a1 a2a1 a2 中分别找出最大和最小元素,然后比较 a1 a2 中的最大最小元 素两个最大元素中大的就是原数组中的最大元素两个最小元素中小的就是原数组中的最 小元素为了要在 a1 a2 中找到最与最小元素可以重复上述过程分别将 a1 a11 a12 a2 分为 a21a22,该过可以一直进行下去,直到在某次分割后的数组中元素 的个数少于三个的时候,此时最多只需要一次比较就可以找出该数组中的最大和最小元素。


package fenzhi;

public class Min_Max {

   
   
    public static IntPair min_max(int[] a, int low, int high){ // 1.  low和 high不能写死,要接收参数
        IntPair pair = new IntPair();    // 2.  定义见算法 5-5
        if (low>high-2){        // 3.
//        if (a[low]<a[high]){    // 4.
//            pair.x = a[high];
//            pair.y = a[low]; } // 5.
//       
//        else{    // 6.
//            pair.y = a[high];
//            pair.x = a[low]; } // 7.
//          // 8.
           
            pair.x=a[low]>a[high]?a[low]:a[high];
            pair.y=a[low]>a[high]?a[high]:a[low];
        }
       
        else{    // 9.
            int mid = (low + high)/2;    // 10.
            IntPair p1 = min_max(a,low,mid);    // 11.
            IntPair p2 = min_max(a,mid+1,high);    // 12.
            pair.x = p1.x>p2.x ? p1.x : p2.x;    // 13.
            pair.y = p1.y<p2.y ? p1.y : p2.y;    // 14.
              // 15.
            return pair;    // 16.
              // 17.

       
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int[] a={1,3,4,5};
        IntPair pair = min_max(a,0,3);  //low 为数组的开始,high为数组最后一个的下标
        System.out.print(pair.x);  //最大5
        System.out.print(pair.y);  //最小1

    }

}




T(n) =    2i  +2log n -1 T(2) = n 2 + n/2 = 3n/2 - 2 ,这比使用算法 5-5 上许多。


0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有