[Java学习]二分法找真值

本文介绍了一个使用Java实现的二分查找算法示例。该算法用于在一个有序区间内搜索特定数值,并逐步缩小搜索范围直至找到目标值或确定目标值不存在于当前区间。文章通过具体的代码实现了递归版的二分查找过程。
<pre name="code" class="java">public class Test {
	public static void printOut(double num, double c) {
	  System.out.println("the true value is " + num + ".");
		System.out.println("the estimate value is " + c + ".");
	}
	
	public static double search(double num, double a, double b) {
		if(a >= b) {
			double temp = a;
			a = b;
			b = temp;
		}
		double c = (a + b)/2;
		if(num > c){
			a = c;
		}
		else if(num < c) {
			b = c;
		}
		else {
			printOut(num, c);
			return c;
		}
		if((b - a) >= 1E-5){
			return search(num, a, b);
		}
		else {
			printOut(num, c);
			return c;
		}
	}

	public static void main(String[] args) {
		search(14.34, 10, 20);
	}
}




                
Java中,使用二分法最大值有不同的应用场景,下面分别介绍在单调递增然后递减的数组和无序数组中使用二分法最大值的实现方法。 ### 在单调递增然后递减的数组中查最大值 在单调递增然后递减的数组中,可以利用二分法高效地查最大值。以下是示例代码: ```java public class BinarySearchMax { public static int findMax(int[] nums) { if (nums == null || nums.length == 0) { throw new IllegalArgumentException("Input array is empty or null"); } int left = 0; int right = nums.length - 1; while (left < right) { int mid = left + (right - left) / 2; if (nums[mid] > nums[mid + 1]) { right = mid; } else { left = mid + 1; } } return nums[left]; } public static void main(String[] args) { int[] nums = {1, 3, 8, 12, 4, 2}; System.out.println("The maximum value is: " + findMax(nums)); } } ``` 在这段代码中,定义了`findMax`方法用于查最大值。首先检查输入数组是否为空或`null`,若满足条件则抛出异常。接着使用二分法,在`while`循环中比较中间元素和其右侧元素的大小,根据比较结果调整左右边界,直到`left`等于`right`,此时到最大值的位置,返回该位置的元素值[^1]。 ### 在无序数组中查最大值 在无序数组中也可以使用二分法最大值,以下是示例代码: ```java public class max { public static void findMax(int[] arr) { if (arr == null) { System.out.println("此数组为空!"); return; } else if (arr.length == 1) { System.out.println(arr[0]); } int max = half(arr, 0, arr.length - 1); System.out.println(max); } public static int half(int[] arr, int a, int b) { if (a == b) { return arr[a]; } int m = a + ((b - a) >> 1); int left = half(arr, a, m); int right = half(arr, m + 1, b); if (left >= right) { return left; } else { return right; } } public static void main(String[] args) { int[] arr = {3, 2, 5, 9, 2, 3, 7, 1, 8}; findMax(arr); } } ``` 这段代码中,`findMax`方法用于判断数组是否为空或只有一个元素,若为空则输出提示信息并返回,若只有一个元素则直接输出该元素。`half`方法是核心的二分最大值方法,通过递归将数组不断二分,分别出左右两部分的最大值,最后比较左右两部分的最大值并返回较大值[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值