二分查找(附遞歸的二分查找方法)


   二分查找是在一組排好序的數組里查找某個指定的元素。

例如查找元素7,則如下。

    利用Scanner獲取一個元素,在數組中查找,先找到數組的中間位置  middle =(left + right)/ 2; 如果所找的元素小於中間位置的元素,則在該中間位置的左邊尋找,並且將middle-1(中間位置已經比過了)值賦給right,在求出左邊元素的中間下標,直到找到該元素,右側的原理相同。

優化middle:為了防止元素過多造成的left+right數據溢出,因此 middle = (right - lef + 1) / 2  + left;    為了提高效率還可以采用位移運算: middle = ((right - left + 1) >> 1)  + left。

實現如下:

import java.util.Scanner;

public class BinarySearch {
    public static void main(String[] args) {
        int arr[] = {1,5,7,10,15,20,28,56,79,85};
        Scanner sc = new Scanner(System.in);
        int val = sc.nextInt();
        int index = search(arr,val);
        System.out.println(index);
    }

    /**
     *
     * @param arr
     * @param val 要查找的數
     * @return 元素下標
     */
    private static int search(int[] arr, int val) {
        int right = arr.length - 1;
        int left = 0;
        while(left <= right) {
            int middle = (right + left) / 2;
            if (val == arr[middle]) {
                return middle;//找到則返回下標
            } else if (val < arr[middle]) {
                right = middle - 1;//要找得數比中間數小則在左邊找
            } else {
                left = middle + 1;//要找得數比中間數小則在右邊找
            }
        }
        return -1;
    }
}

 

 附上二分查找的遞歸方法(自己調用自己):

public class BinarySearchDemo {
    public static void main(String[] args) {
        int arr[] = {1,5,7,10,15,20,28,56,79,85};
        int index = binarySearch(arr,0,arr.length - 1,10);
        System.out.println(index);
    }

    /**
     *
     * @param arr
     * @param l 左下標
     * @param r 右下標
     * @param data  數據
     * @return
     */
    private static int binarySearch(int[] arr, int l, int r, int data) {
        int mid = (l + r) / 2;
        if(r < l){
            return -1;
        }
        if(arr[mid] == data){
            return mid;
        }
        if(arr[mid] < data){
            return binarySearch(arr,mid+1,r,data);
        }else{
            return binarySearch(arr,l,mid-1,data);
        }
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM