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

来源:互联网 发布:mac用什么五笔 编辑:程序博客网 时间:2024/05/18 00:17

解题思路:

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;}