二分查找(Binary Search)Java实现
Posted zyrjessie
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二分查找(Binary Search)Java实现相关的知识,希望对你有一定的参考价值。
使用二分查找的序列必须是有序的。
时间复杂度O(logn),每次当前序列长度的一半。
1. 递归实现
/** * To search if the target is in a given array. If find, return the position of * the target in a given array. If not, return -1. */ public int bsRecursion(int[] input, int low, int high, int target) { int middle = (low + high) / 2; // base case if (target < input[low] || target > input[high] || low > high) { return -1; } if (target < input[middle]) { return bsRecursion(input, low, middle - 1, target); } else if (target > input[middle]) { return bsRecursion(input, low + 1, high, target); } else { return middle; } }
错误写法
递归应该返回的是最后一次调用bsResursion的返回值,每一次递归调用函数,都会有一个middle变量和返回值,
如果这样写,相当于无论最终递归调用的返回值是多少,都会返回第一次调用函数时的返回值。
public int bsRecursion(int[] input, int low, int high, int target) {
int middle = (low + high) / 2;
// base case
if (target < input[low] || target > input[high] || low > high) {
return -1;
}
if (target < input[middle]) {
bsRecursion(input, low, middle - 1, target);
} else if (target > input[middle]) {
bsRecursion(input, low + 1, high, target);
} else {
return middle;
}
}
2. 非递归实现(while循环)
public int bsNonRecursion(int[] input, int target) { int low = 0; int high = input.length - 1; if (target < input[low] || target > input[high] || low > high) { return -1; } while (low <= high) { // update middle every iteration int middle = (low + high) / 2; if (target < input[middle]) { high = middle - 1; } else if (target > input[middle]) { low = middle + 1; } else { return middle; } } // not find in the end return -1; }
以上是关于二分查找(Binary Search)Java实现的主要内容,如果未能解决你的问题,请参考以下文章