【數據結構】| 二分查找

二分查找是一種效率較高的查找方法,時間複雜度是O(logn)java

二分查找:每次都經過跟區間中的中間元素對比,將待查找的區間縮小爲一半,直到找到要查找的元素,或 者區間被縮小爲0數組

使用前提:spa

  1. 二分查找必須依賴順序表結構(數組)
  2. 二分查找查詢的數據必須是有序的

關於查詢數據的大小,若是查詢的數據過小,直接遍歷就能夠,二者效率相差不大,若是要查找的數據太大,由於二分查找必須依賴順序表結構,因此須要申請的空間必須是連續的,有可能會出現沒有足夠的連續內存空間的狀況code

實現:遞歸

數組arr:{1,4,7,8,12,43,56,87,98,323,3545,5685},利用二分查找返回數組下標內存

例:查找43輸出5it

public static int binary(int[] arr, int n){
    int start = 0;
    int end = arr.length - 1;
    while (start<=end){
        int mid = (start + end)/2;
        if(arr[mid]== n){
            return mid;
        } else if (n > arr[mid]) {
            start = mid + 1;
        } else {
            end = mid - 1;
        }
    }
    return -1;
}
複製代碼

遞歸實現:io

public static int binary(int[] arr, int n, int start, int end){
    if(start > end){
        return -1;
    }
    int mid = (start + end)/2;
    if(arr[mid] == n){
        return mid;
    } else if (n > arr[mid]) {
        return binary(arr, n, mid + 1, end);
    } else {
        return binary(arr, n, start, mid - 1);
    }
}
複製代碼

當數組中沒有重複數據時,能夠使用上述方法,可是有些需求多是數組中有重複數據,須要查找數組中某個數的第一次出現的下標function

例:數組{1,4,7,43,43,43,56,87,98,323,3545,5685},查找43輸出3class

public static int binary(int[] arr, int n){
    int start = 0;
    int end = arr.length - 1;
    while (start<=end){
        int mid = (start + end)/2;
        if(arr[mid] == n && mid>0 && arr[mid -1] != n ){
            return mid;
        } else if (n > arr[mid]) {
            start = mid + 1;
        } else {
            end = mid - 1;
        }
    }
    return -1;
}
複製代碼
相關文章
相關標籤/搜索