Java二分法查找最大值
目录
1,二分法查找最大值的实现思路
2,二分法查找最大值的重点
3,二分法查找最大值java实现
代码:
结果:
4,另一种递归的实现:
总结:
二分法查找最大值,跟直接遍历并没有多大的区别,主要是使用的思路。理解了归并排序,查找最大值的就简单多了。
1,二分法查找最大值的实现思路
1,将要排序的n个内容,看成n个长度为1的有序表
2,将n个有序列表,拆分为n/2个长度为2的有序列表
3,重复2 的操作,直到所有记录n/2为1或2,可以进行值比较的两个值
4,将拆分的有序列表进行判断,留下大的值。
比如有一组的数字:25, 5, 83, 99, 28, 57, 95, 57, 35, 3
分割和归并的过程如图:
2,二分法查找最大值的重点
由图可以看出,拆分是比较容易的,找最大值也简单。
// 定义一个比较两个数值大小的函数
private static int compare(int a,int b){
System.out.println("第"+(++number)+"趟进行比较:\t");
return a>b?a:b;
}
1,找临界点,因为比较最少要两个值:
if (left > right - 2) { // 小于等于两个值
System.out.println("left value: "+ dataArr[left] + " right value: "+ dataArr[right]);
max = compare(dataArr[left], dataArr[right]);
}
2,得到左右两边最大的值进行比较
int mid = (left + right) / 2;
int leftMax = getMax(dataArr, left, mid);
int rightMax = getMax(dataArr, mid + 1, right);
System.out.println("left max: "+ leftMax + " right max "+ rightMax);
max = compare(leftMax, rightMax);
3,二分法查找最大值java实现
代码:
public class BinaryFindMax {
private static int number=0;
public static void main(String[] args) {
int[] data = {25, 5, 83, 99, 28, 57, 95, 57, 35, 3 };
int max = getMax(data, 0, data.length - 1);
System.out.println("max value: "+max);
}
/**
* 用递归算法求数组中的最大值
*
* @param dataArr 数组
* @param right 数组下标
* @param right 数组上标
* @return
*/
public static int getMax(int[] dataArr, int left, int right) {
int max;
if (left > right - 2) { // 小于等于两个值
System.out.println("left value: "+ dataArr[left] + " right value: "+ dataArr[right]);
max = compare(dataArr[left], dataArr[right]);
} else {
int mid = (left + right) / 2;
int leftMax = getMax(dataArr, left, mid);
int rightMax = getMax(dataArr, mid + 1, right);
System.out.println("left max: "+ leftMax + " right max "+ rightMax);
max = compare(leftMax, rightMax);
}
return max;
}
// 定义一个比较两个数值大小的函数
private static int compare(int a,int b){
System.out.println("第"+(++number)+"趟进行比较:\t");
return a>b?a:b;
}
}
结果:
left value: 25 right value: 5
第1趟进行比较:
left value: 83 right value: 83
第2趟进行比较:
left max: 25 right max 83
第3趟进行比较:
left value: 99 right value: 28
第4趟进行比较:
left max: 83 right max 99
第5趟进行比较:
left value: 57 right value: 95
第6趟进行比较:
left value: 57 right value: 57
第7趟进行比较:
left max: 95 right max 57
第8趟进行比较:
left value: 35 right value: 3
第9趟进行比较:
left max: 95 right max 35
第10趟进行比较:
left max: 99 right max 95
第11趟进行比较:
max value: 99
4,另一种递归的实现:
private static int max(int a,int b){ //定义一个比较两个数值大小的函数
return a>b?a:b;
}
// 用数组的第一个值作为初始值
// 然后从数组的二个值开始,开始递进到最后一个值,然后回归,不断进行两两比较
public static int getMaxNum(int[] arr,int startIndex){
if(startIndex==arr.length){
return arr[0];
}
return max(arr[startIndex],getMaxNum(arr,startIndex+1));
}
public static void main(String[] args){
int array[]= {162,233,77,99,69,56,89,174,86,78};
System.out.print(getMaxNum(array,0));
}
总结:
二分法查找最大值,本身不具有什么样的优势。主要是“分治”方法的一种应用。当作练习还是不错的。