注意
二分查找要求原數組為有序序列,從小到大
遞歸解法
public class problem9 {public static void main(String[] args) {int[] arr = {1,2,3,4,6,7};int left = 0;int right = arr.length - 1;int value = 2;System.out.println(Arrays.toString(arr));int index = binary(arr, left, right, value);System.out.println(index);}
//遞歸解法public static int binary(int[] arr, int left, int right, int value) {if (left > right)
//沒有找到就返回-1return -1;
//中間數的下標
/*1.(left+right)/2
* 2.(left + right) >>> 1:無符號右移1,相當于除以2
* */int midIndex=(left + right) >>> 1;
//中間數int middle = arr[midIndex];if (value > middle)
//如果比中間數大,就從中間數的右邊進行查找return binary(arr, middle + 1, right, value);else if (value < middle)
//如果比中間數小,就從中間數的左邊進行查找return binary(arr, left, middle - 1, value);else
//等于中間數,直接返回下標return midIndex;}
}
非遞歸解法
public class problem9_1 {public static void main(String[] args) {int[] arr = {1,2,3,4,6,7};int left = 0;int right = arr.length - 1;int value = 2;System.out.println(Arrays.toString(arr));int index = binary(arr, left, right, value);System.out.println(index);}//非遞歸解法public static int binary(int[] arr, int left, int right, int value) {while (left<=right){int midIndex=(left+right)>>>1;int middle=arr[midIndex];if (value>middle)left=midIndex+1;else if (value<middle)right=midIndex-1;elsereturn midIndex;}return -1;}}