BinarySearch二分查找是一种针对有序数据很高效的查找算法;
以下demo基本包含二分查找的非递归和递归实现:
二分查找类 BinarySearch.java
/**
* @Author: ltx
* 二分查找算法
*/
public class BinarySearch {
/**
* 二分查找-非递归实现
*
* @param arr 数组
* @param value 值
* @return 下标
*/
private int binarySearch(int arr[], int value) {
int left = 0;
int right = arr.length - 1; //避免数组越界
//<=是因为右边是数组最后一个元素位置
while (left <= right) {
int mid = (left + right) / 2;
if (arr[mid] == value) {
return mid;
}
if (arr[mid] > value) {
right = mid - 1; //左边界,-1是因为mid已经查过了,从mid左边范围查
} else {
left = mid + 1; //右边界,+1是因为mid已经查过了,从mid右边范围查
}
}
return -1;
}
/**
* 二分查找-递归实现
*
* @param arr 数组
* @param value 值
* @param left 左边界
* @param right 右边界
* @return
*/
private int binarySearchRecursion(int arr[], int value, int left, int right) {
int mid = (left + right) / 2;
if (left <= right) {
if (arr[mid] == value) {
return mid;
}
if (arr[mid] > value) {
right = mid - 1; //-1是因为mid已经查过了,从mid左边范围查
} else {
left = mid + 1; //+1是因为mid已经查过了,从mid右边范围查
}
return binarySearchRecursion(arr, value, left, right);
}
return -1;
}
public static void main(String[] args) {
int[] arr = {7, 3, 8, 10, 12, 5, 1, 9, 2, 6, 4};
System.out.println("排序: ");
//排序
Arrays.sort(arr);
System.out.println(Arrays.toString(arr));
BinarySearch serachDemo = new BinarySearch();
System.out.println("二分查找-非递归实现: ");
System.out.println(serachDemo.binarySearch(arr, 3));
System.out.println("二分查找-递归实现: ");
System.out.println(serachDemo.binarySearchRecursion(arr, 3, 0, arr.length - 1));
}
}