分治的经典算法。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import java.util.Random; import java.util.Arrays; public class BinarySearch{ public static int binarySearch(int[] A, int x){ return binarySearchDo(A, x, 0, A.length-1); } private static int binarySearchDo(int[] A, int x, int low, int high){ if(low > high) return -1; int mid = (low + high) / 2; if(A[mid] == x) return mid; //Divide and Conquer if(x < A[mid]) return binarySearchDo(A, x, low, mid-1); return binarySearchDo(A, x, mid+1, high); } public static int binarySearchIter(int[] A, int x){ //Iteration int low = 0; int high = A.length-1; while(low <= high){ int mid = (low + high) / 2; if(A[mid] == x) return mid; if(x < A[mid]) high = mid - 1; else low = mid + 1; } return -1; } public static void main(String[] args) { //Unit Testing int n = 10; int[] A = new int[n]; Random rand = new Random(); for(int i = 0; i < A.length; i ++){ A[i] = rand.nextInt(1<<20) % 100; } int x = A[rand.nextInt(A.length)]; Arrays.sort(A); System.out.println(Arrays.toString(A)); System.out.println(x); System.out.println(binarySearch(A, x)); System.out.println(binarySearchIter(A, x)); x = -1; System.out.println(binarySearch(A, x)); System.out.println(binarySearchIter(A, x)); } }