public class getMaxMin {
/**
* 分治思想:先分别求出前半部分和后半部分数组的最大值和最小值,
* 两部分中的最大值和最小值分别比较求出整个数组的最大值和最小值
* 比较次数为3*N/2-2次
* @param arr
* @param start
* @param end
* @param Max
* @param Min
*/
public static void findMaxMin(int[] arr,int start,int end,int Max,int Min){
if(end - start <= 1){
if(arr[start] > arr[end]){
Max = arr[start];
Min = arr[end];
} else{
Max = arr[end];
Min = arr[start];
}
return;
}
int leftMax = 0;
int leftMin = 0;
int rightMax = 0;
int rightMin = 0;
findMaxMin(arr,start,(start + end) / 2,leftMax,leftMin);
findMaxMin(arr,(start + end) / 2 + 1,end,rightMax,rightMin);
Max = leftMax > rightMax ? leftMax : rightMax;
Min = leftMin < rightMin ? leftMin : rightMin;
}
public static void main(String[] args) {
int max = 0;
int min = 0;
int arr[] = {7,3,19,48,4,17,-12,10};
findMaxMin(arr,0,arr.length - 1,max,min);
System.out.println("max = " + max);
System.out.println("min = " + min);
}
}
为什么得不到结果,哪里错了?
java中int这些值作为参数,改变形参(在函数中赋值)不会作用到实参(调用者定义的变量)。
你需要定义一个类
class MyRef
{
public int max;
public int min;
}
public static void findMaxMin(int[] arr,int start,int end,int Max,int Min)
->
public static void findMaxMin(int[] arr,int start,int end,MyRef m)
MyRef m1 = new MyRef();
m1.max = leftMax;
m1.min = leftMin;
findMaxMin(arr,start,(start + end) / 2,m1);
MyRef m2 = new MyRef();
m2.max = rightMax;
m2.min = rightMin;
findMaxMin(arr,(start + end) / 2 + 1,end,m2);
...
Max = leftMax > rightMax ? leftMax : rightMax;
Min = leftMin < rightMin ? leftMin : rightMin;
->
m.Max = m1.Max > m2.Max ? m1.Max : m2.Max;
m.Min = m1.Min < m2.Min ? m1.Min : m2.Min;
你输出的max,min应该是0吧,你的findMaxMin这个方法要有返回值才行吧,不然你调用的时候进去的形参,最后再main方法里面输出的来还是你定义的
0;你的findMaxMIn 加个return new int[]{max,min};
你把变量的作用域弄错了吧,
/**
* 分治思想:先分别求出前半部分和后半部分数组的最大值和最小值,
* 两部分中的最大值和最小值分别比较求出整个数组的最大值和最小值
* 比较次数为3*N/2-2次
* @param arr
* @param start
* @param end
* @param Max
* @param Min
*/
static int max = 0;
static int min = 0;
public static void findMaxMin(int[] arr,int start,int end){
if(end - start <= 1){
if(arr[start] > arr[end]){
max = arr[start];
min = arr[end];
} else{
max = arr[end];
min = arr[start];
}
return;
}
int leftMax = 0;
int leftMin = 0;
int rightMax = 0;
int rightMin = 0;
findMaxMin(arr,start,(start + end) / 2);
findMaxMin(arr,(start + end) / 2 + 1,end);
//
// max = leftMax > rightMax ? leftMax : rightMax;
// min = leftMin < rightMin ? leftMin : rightMin;
}
public static void main(String[] args) {
int arr[] = {7,3,19,48,4,17,-12,10};
findMaxMin(arr,0,arr.length - 1);
System.out.println("msg max = " + max);
System.out.println("msg min = " + min);
}
这个样修改下就有值了,结果的对错就你自己验证修改咯