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;