查找算法----二分查找

二分查找

也稱爲折半查找,屬於有序查找算法。用給定值k先與中間結點的關鍵字比較,中間結點把線性表分成兩個子表,若相等則查找成功,若不相等,在根據k與該中間結點關鍵字的比較結果確定下一步查找哪個子表,這樣遞歸進行,直到查找到或者找結束髮現表中沒有這樣的點。
元素必須是有序的,如果是無序的則要先進行排序操作。
時間複雜度爲O(loig2n)
折半查找的前提是需要有序表順序存儲,對於靜態查找表,一次排序後不再變化,折半查找能得到不錯的效率。但對於需要頻繁執行插入或刪除操作的數據集來說,維護有序的排序會帶來不小的工作量,因此不建議使用。
迭代法
在這裏插入圖片描述
遞歸法
在這裏插入圖片描述

package 查找算法;
//二分查找
public class BinarySearch {
    public static void main(String[] args) {
        int arr[]={1,2,3,4,5,6,7,8,9};
        int key=8;
        //迭代法
        int index=binarySearch(arr,key);
        System.out.println("index="+index);

        //遞歸法
        int index1=binarySearch(arr,key,0,arr.length-1);
        System.out.println("index="+index1);

    }

    private static int binarySearch(int[] arr, int key, int low, int high) {
        if(low>high){
            return -1;
        }
        int mid=(low+high)/2;
        if(arr[mid]==key){
            return mid;
        }else if (key<arr[mid]){
            return binarySearch(arr,key,low,mid-1);
        }else {
            return binarySearch(arr,key,mid+1,high);
        }
    }

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

執行結果

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