您的位置:首页 > 编程语言 > Java开发

Java 分治法 求解一组数组元素的最大值和最小值

2016-06-28 22:53 387 查看
分治法的思想:

将求出的小规模的问题的解合并为一个更大规模的问题的解,自底向上逐步求出原来问题的解。

分治法的设计思想,将一个难以直接解决的大问题,分割成一些规模较小的相同问题,从小的问题一个个解决,分而治之。

求解一组数组元素的最大值和最小值,传统的方法,我们可以使用遍历或者最简单的排序方法来实现,但是时间复杂度非常高,介于降低时间复杂度,我们可以采用分治法思想求出最大值和最小值。

步骤:

先求出左半部分的最大值最小值,再求出右半部分的最大值和最小值,然后把左右两部分的最大值和最小值合起来,求出最终的最大值和最小值。

这次使用Java,利用分治法实现一组数组元素的最大值和最小值。

import java.util.Scanner;
public class Test2 {
public static void max_min(int []a,int left,int right,int []maxnum,int []minnum)
{
if (left==right)   //当只有一个元素时候,直接得出最大值和最小值
{
maxnum[0]=a[left];
minnum[0]=a[right];
}
else if (left+1==right)//当数组中有两个元素时,直接判断哪个元素大,哪个元素小
{
if (a[left]>a[right])
{
maxnum[0]=a[left];
minnum[0]=a[left];
}
else
{
maxnum[0]=a[right];
minnum[0]=a[left];
}
}
else     //当数组元素的个数大于2以上的操作。
{
int m=(left+right)/2;
//int lmax=0,lmin=0,rmax=0,rmin=0;
int lmax[]={0};
int lmin[]={0};
int rmax[]={0};
int rmin[]={0};

max_min(a,left,m,lmax,lmin);
max_min(a, m+1, right, rmax, rmin);

// maxnum=lmax>rmax?lmax:rmax;
// minnum=lmin<rmin?lmin:rmin;
if(lmax[0]>rmax[0])
{
maxnum[0]=lmax[0];
}
else
{
maxnum[0]=rmax[0];
}
if(lmin[0]<rmin[0])
{
minnum[0]=lmin[0];
}
else
{
minnum[0]=rmin[0];
}
}
//System.out.println("最大值:"+maxnum);
//System.out.println("最小值: "+minnum);

}
public static void main(String[] args)
{
int array[]={-2,9,1,-4,6};
int []Max=new int[1];  //java对于实参传递,是采用值传递,所以要改成数组,不能直接使用变量去计算最大值和最小值。
int []Min=new int[1];
new Test2().max_min(array,0,array.length-1,Max,Min);

System.out.println("最大值: "+Max[0]);
System.out.println("最小值: "+Min[0]);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 分治法 java