二分搜索

分治的经典算法。

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));
    }
}
Java
原文地址:https://www.cnblogs.com/7hat/p/3393610.html