Java实现二分查找

二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素必须有序排列。

折半查找法的优点是比较次数少查找速度快平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表

先上代码:

import java.util.Arrays;

public class Demo7 {

	public static void main(String[] args) {
		int[] arr = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
		int num = 4;
		int begin = 0;
        // end边界必须是arr.length,否则最后一个数可能查找不到
		int end = arr.length;
		int mid = (end + begin) / 2;

		while (true) {
			if (num > arr[mid]) {
				begin = mid + 1;
				mid = (end + begin) / 2;
			} else if (num < arr[mid]) {
				end = mid - 1;
				mid = (end + begin) / 2;
			} else {
				System.out.println("数字在索引为" + mid + "的位置。");
				break;
			} 
			// 此判断条件非常重要
			if (mid == arr.length || end < begin){
				System.out.println("数字不在数组中。");
				break;
			}
		}

    }
}

分析可知,如果要查找的目标数num大于数组最大数,则mid最终会与arr.length相等,如果要查找的目标数num小于数组最小数,则end会小于begin,因为最后end为-1,begin为0。注意千万不要写成mid<0,因为(-1+0)/ 2 = 0,mid会永远等于0,从而不会<0,造成死循环,打印不出“数字不在数组中。”

如果理解什么是二分查找,换查找边界begin和end不难,但要特别注意跳出循环的条件, 否则会造成死循环。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值