Java二分法查找(遞歸、循環實現)

Java二分法查找(遞歸、循環實現)

public class BinarySearch {
    public static void main(String[] args) {
        /**
         * @author JadeXu
         * @// TODO: 2020/12/7 二分查找
         * 思路:
         * 一、獲取數組的中間值,先獲取下標,方便屢次查找
         * 奇數位的數組直接獲取中間位,偶數位的數組獲取中間的第一位或第二位均可,通常獲取第一位(由於與奇數位獲取中間值的方法同樣)
         * 二、獲取查找的區間範圍,start:區間開始的下標,end:區間結束的下標
         * 三、判斷查找的數和中間位的數是否相同
         * 相同時,直接返回須要的數據,跳出方法
         * 大於時,即數可能在中間值右邊的區間內,此時將開始下標+1,即日後移一位,就獲得了中間值右邊區間的開始下標
         * 小於時,即數可能在中間值左邊的區間內,此時將結束下標-1,即往前移一位,就獲得了中間值左邊區間的結束下標
         * 當一個區間裏,開始下標小於等於結束下標時,該區間纔是有效區間,才能繼續查找。不然無效,返回找不到,跳出方法
         */
    }
    /**
     *循環
     * @param arr 已經升序好的int[]
     * @param num 須要查找的數字
     * @return 找到則返回下標,沒找到則返回-1
     */
    private static int binarySearchByCycle(int[] arr,int num) {
        int start = 0;
        int end = arr.length - 1;

        while (start <= end){
            int mid = (start + end) / 2;
            if(num == arr[mid]){
                return mid;
            }else if(num > arr[mid]){
                start += 1;
            }else {
                end -= 1;
            }
        }
        return -1;
    }

    /**
     * 遞歸
     * @param arr 已經升序好的int[]
     * @param num 須要查找的數字
     * @param start 區間開始下標
     * @param end 區間結束下標
     * @return 找到則返回下標,沒找到則返回-1
     */
    private static int binarySearchByRecursion(int[] arr,int num,int start,int end) {
        int mid = (start + end) / 2;
        if(num == arr[mid]){
            return mid;
        }else if(num > arr[mid]){
            start += 1;
        }else {
            end -= 1;
        }
        if(start <= end && num != arr[mid]){
            mid = binarySearchByRecursion(arr,num,start,end);  //遞歸繼續尋找
        }else {
            mid = -1;
        }
        return mid;
    }
}
相關文章
相關標籤/搜索