算法:二分查找Java版
Posted LuckyWangxs
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法:二分查找Java版相关的知识,希望对你有一定的参考价值。
一、思路
二分查找需要在具有索引的有序序列集合上进行操作。首先二分查找需要维护左中右三个索引,假设现在有一个升序序列,首先以序列第一位为左左索引,最后一个为右索引,以左右平均数为中索引,每次取出中索引的数与查找目标作比较,如果中索引的元素小于目表元素,则需要去大于中索引的搜索空间搜索,将中索引加1赋值给左索引,重复上述比较操作,直到查到目表或左索引大于右索引为止。
二、代码
1. 循环版本
/**
* 常规循环方式二分查找
* @param arr 目标数组
* @param e 目标值
* @return 找到则返回下标, 找不到返回负数
*/
public static int binarySearch(int[] arr, int e) {
int low = 0, mid;
int high = arr.length - 1;
while (low <= high) {
// 相当于 (high + low) / 2, 位运算效率高
mid = (high + low) >>> 1;
if (e < arr[mid])
high = mid - 1;
else if (e > arr[mid])
low = mid + 1;
else
return mid;
}
return -(low + 1);
}
2. 递归版本
/**
* 递归方式二分查找
* @param arr 目标数组
* @param fromIndex 查找起始下标
* @param endIndex 查找结束下标
* @param e 目标元素
* @return 查到返回下标, 否则返回-1
*/
public static int binarySearch(int[] arr, int fromIndex, int endIndex, int e) {
if (fromIndex <= endIndex) {
int mid = (fromIndex + endIndex) >>> 1;
if (e < arr[mid]) {
return binarySearch(arr, fromIndex, mid - 1, e);
} else if (e > arr[mid]) {
return binarySearch(arr, mid + 1, endIndex, e);
} else {
return mid;
}
}
return -1;
}
三、测试
public static void main(String[] args) {
int[] arr = {1, 3, 7, 8, 11, 15, 23};
System.out.println(binarySearch(arr, 3));
System.out.println(binarySearch(arr, 33));
System.out.println(binarySearch(arr, 0, arr.length - 1, 3));
System.out.println(binarySearch(arr, 0, arr.length - 1, 33));
}
输出结果:
"C:\\Program Files\\Java\\jdk1.8.0_192\\bin\\java.exe" ...
1
-8
1
-1
Process finished with exit code 0
以上是关于算法:二分查找Java版的主要内容,如果未能解决你的问题,请参考以下文章