java算法-二分查找算法

一、二分查找算法思想

又叫折半查找,要求待查找的序列有序。每次取中間位置的值與待查關鍵字比較,如果中間位置的值比待查關鍵字大,則在前半部分循環這個查找的過程,如果中間位置的值比待查關鍵字小,則在後半部分循環這個查找的過程。直到查找到了爲止,否則序列中沒有待查的關鍵字。
 
二、圖示說明
 

三、二分查找優缺點

優點是比較次數少,查找速度快,平均性能好;

其缺點是要求待查表爲有序表,且插入刪除困難。

因此,折半查找方法適用於不經常變動而查找頻繁的有序列表。

使用條件:查找序列是順序結構,有序。

四、代碼實現

1.非遞歸方法

 private static int binarySearch(int[] arr, int key) {
        int left = 0;
        int right  = arr.length-1;
        int mid ;
        if (key < arr[left] || key > arr[right] || left > right){
          return -1;
        }
        while(left < right){
            mid = (left + right)/2;
            if (arr[mid] < key){
                left = mid +1;
            }else if(arr[mid] > key){
                right = mid - 1;
            }else {
                return mid ;
            }
        }
        return -1;
    }

2.遞歸方法

 public static int binarySearch(int[] arr,int left,int right,int key){
        if (key < arr[left] || key > arr[right] || left > right){
            return -1;
        }
        int mid = (left+right)/2;
        if (arr[mid]<key){
           return binarySearch(arr,mid+1,right,key);
        }else if(arr[mid]>key){
           return binarySearch(arr,left,mid-1,key);
        }else {
            return mid;
        }
    }

五、時間複雜度和空間複雜度

時間複雜度
採用的是分治策略

最壞的情況下兩種方式時間複雜度一樣:O(log2 N)

最好情況下爲O(1)

空間複雜度
  算法的空間複雜度並不是計算實際佔用的空間,而是計算整個算法的輔助空間單元的個數

非遞歸方式:由於輔助空間是常數級別的,所以空間複雜度是O(1);

遞歸方式: 遞歸的次數和深度都是log2 N,每次所需要的輔助空間都是常數級別的:
 空間複雜度:O(log2N )
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章