二分查找(折半查找)的思路与实现 java实现

解题思路:

1.迭代方式:方法内包含四个参数,分别是已排好序的数组(二分查找的前提是数组已经有序),待查找的起始索引start,待查找的结束索引end,目标元素target。首先找到数组中的中间元素的索引,即mid = (start + end)/2;比较mid指向元素与target是否相等,若相等则查找成功;若target比mid指向元素小,则target在mid的左边,则下次查找的结束位置为mid-1;若target比mid指向元素大,则下次查找的起始范围为mid+1;不断迭代直到start和end交叉开来,即start> end时,循环结束。

/**
	 * 二分查找的迭代实现
	 * 
	 * @param arr
	 *            待查找的数组
	 * @param start
	 *            数组中待查找的起始位置
	 * @param end
	 *            数组中待查找的结束位置
	 * @param target
	 *            待查找元素
	 * @return true即找到,false未找到
	 */
	public boolean binarySearch(int[] arr, int start, int end, int target) {

		if (arr == null || arr.length == 0 || start < 0 || start >= arr.length || end < 0 || end >= arr.length
				|| start > end) {

			return false;
		}

		boolean result = false;

		while (start <= end && start < arr.length && end >= 0) {
			// 求出当前范围的数组中间的索引
			int mid = (start + end) / 2;
			if (arr[mid] == target) {
				result = true;
				break;
			} else if (arr[mid] < target) {
				// 此时缩小查找范围,在数组的右半部分查找
				start = mid + 1;
			} else {
				// 此时缩小查找范围,在数组的左半部分查找
				end = mid - 1;
			}

		}

		return result;

	}

2.递归实现:首先还是取出数组的中间元素与target做比较,若相等,则查找成功,这也是递归的终止条件;若target比中间元素小,则在数组的左半部分继续进行二分查找,此时end = mid - 1;若target比中间元素大,则在数组的右半部分继续进行二分查找,此时start = mid + 1;

/**
	 * 二分查找的递归实现
	 * 
	 * @param arr
	 * @param start
	 * @param end
	 * @param target
	 * @return
	 */
	public boolean binarySearch_recursively(int[] arr, int start, int end, int target) {
		
		if (arr == null || arr.length == 0 
				|| start < 0 || start >= arr.length 
				|| end < 0 || end >= arr.length
				|| start > end) {

			return false;
		}
		
		boolean result = false;
		
		int mid = (start + end) / 2;
		if (arr[mid] == target) {
			result = true;
		} else if (arr[mid] < target) {
			//在数组的右半部分继续进行二分查找
			result = binarySearch_recursively(arr, mid + 1, end, target);
		} else {
			//在数组的左半部分继续进行二分查找
			result = binarySearch_recursively(arr, start, mid - 1, target);
		}
		
		return result;
	}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值