解题思路:
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;
}