package com.example.demo;
import java.util.Arrays;
/**
* 二分法查找
*/
public class BinarySearch {
public static void main(String[] args) {
int[] arr = {30, 20, 20, 50, 10, 80, 9, 7, 12, 100, 40, 8};
//二分法查找需要是一个有序的数组
Arrays.sort(arr);
// sort方法底层使用的的快速排序 DualPivotQuicksort.sort(a, 0, a.length - 1, null, 0, 0);
System.out.println(Arrays.toString(arr));
System.out.println(binarySearch(arr, 8));
System.out.println(binarySearchByRecursion(arr, 0, arr.length - 1, 8));
}
/**
* 二分法查找的非递归实现
*
* @param arr 需要查找的数组
* @param value 查找的值
* @return 返回value的index
*/
private static int binarySearch(int[] arr, int value) {
int low = 0;
int high = arr.length - 1;
while (low <= high) {
int mid = low + (high - low) / 2;
if (value == arr[mid]) {
return mid;
}
if (value > arr[mid]) {
low = mid + 1;
}
if (value < arr[mid]) {
high = mid - 1;
}
}
return -1;//没有找到返回-1
}
/**
* 递归方法实现二分查找法.
*
* @param arr 数组
* @param low 数组第一位置
* @param high 最高
* @param key 要查找的值.
* @return 返回值.
*/
private static int binarySearchByRecursion(int[] arr, int low, int high, int key) {
if (low <= high) {
int mid = (low + high) / 2;
if (key == arr[mid])
return mid;
else if (key < arr[mid])
//移动low和high
return binarySearchByRecursion(arr, low, mid - 1, key);
else if (key > arr[mid])
return binarySearchByRecursion(arr, mid + 1, high, key);
}
return -1;
}
}