【二分查找】 二分查找的递归实现方式和非递归实现方式
前几天刷到过一个 二分查找
的题,当时忘记怎么写了。。。于是去复习了一下二分查找,成功完成了那道题。为了加深印象,今天再复习一遍,把二分查找的两种方式都实现一下。
据我所知,二分查找有以下两种实现方式:
- 递归式
- 非递归式
递归式
废话不多说,直接上代码。
/**
* 二分查找算法
*
* @param arr 有序数组
* @param target 查找的元素
* @param left 左区间
* @param right 右区间
* @return
*/
public int binarySearch(int[] arr, int target, int left, int right) {
int mid = (left + right) / 2;
if (target > arr[mid] && left <= right) {
return binarySearch(arr, target, mid + 1, right);
} else if (target < arr[mid] && left <= right) {
return binarySearch(arr, target, left, mid - 1);
} else if (target == arr[mid]) {
return mid;
}
return -1;
}
这样就完成了二分查找的功能,不过这个代码有一个缺点,就是只能查找数组里面包含的元素,不在数组里面的元素只能返回-1。于是提出一个新的需求**“在查找数组不存在的元素时,返回它将会被按顺序插入的下标”** 。即假如数组为 arr=[1,3,5,6],target=2
,返回1;
增强的代码如下:
/**
* 二分查找算法
*
* @param arr 有序数组
* @param target 查找的元素
* @param left 左区间
* @param right 右区间
* @return
*/
public int binarySearchPlus(int[] arr, int target, int left, int right) {
int mid = (left + right) / 2;
if (target > arr[mid] && left <= right) {
return binarySearch(arr, target, mid + 1, right);
} else if (target < arr[mid] && left <= right) {
return binarySearch(arr, target, left, mid - 1);
} else if (target == arr[mid]) {
return mid;
} else {
return mid + 1;
}
}
非递归式
先展示基础代码。
public int binarySearch01(int[] arr, int target, int left, int right) {
int mid = (left + right) / 2;
while (left <= right) {
mid = (left + right) / 2;
if (arr[mid] > target) {
right = mid - 1;
} else if (arr[mid] < target) {
left = mid + 1;
} else {
return mid;
}
}
return -1;
}
下面同样是增强代码。
public int binarySearch01Plus(int[] arr, int target, int left, int right) {
int mid = (left + right) / 2;
while (left <= right) {
mid = (left + right) / 2;
if (arr[mid] > target) {
right = mid - 1;
} else if (arr[mid] < target) {
left = mid + 1;
} else {
return mid;
}
}
return mid + 1;
}
不要问为我啥不写实现过程和原理,因为这主要是写给我自己复习看的。