1. 程式人生 > >算法:二分搜索法

算法:二分搜索法

一次 最簡 out static 指針 固定 void println 查詢

目錄

@(二分搜索法)
例如:

int a[]= {1,2,3,4,5,6,7,8};

一個數組,我們要從中找到5在其中的位置,最簡單就是如下:


for(int i=0;i<a.length;i++){
    if(a[i]==5){
        return i;
    }
}

這種方法用大O表達法分析[^1]的話,
i=0;的頻度為1
i<a.length的頻度為n; ==a.length的長度不是固定的==
if語句也執行了n次
時間復雜度為:
T(n)= 1+ 2*n;

可以寫為T(n)=O(n)

使用二分搜索法的話:

~非遞歸實現~

public static void main(String[] args) {
        // TODO Auto-generated method stub
        int a[]= {1,2,3,4,5,6,7,8};
        System.out.println(binarySearch(a, 7));
        System.out.println(binarySearchp(a, 7,0,a.length-1));
    }
    /**
     * 非遞歸
     * @param a  需要查詢的數組
     * @param x 需要查詢的值
     * @return 數組中的索引
     */
    public static int binarySearch(int a[],int x) {
        int l=0,r=a.length-1;
        while(l<=r) {
            int m=(l+r)/2;
            if(a[m]==x) {
                return m;
            }else if(a[m]>x) {
                r=m-1;
                
            }else {
                l=m+1;
            }
            
        }
        return -1;
    }

~遞歸實現~

/**
     * 遞歸
     * @param a 數組
     * @param x 需要查詢的值
     * @param l 左邊的指針
     * @param r 右邊的指針
     * @return  在數組中的索引
     */
    public static int binarySearchp(int a[],int x,int l,int r) {
            int m=(l+r)/2;
            int res=0;
            if(a[m]==x) {
                return  m;
            }else if(a[m]>x) {
                return binarySearchp(a, x,l,m-1);
            }else {
                return binarySearchp(a, x,m+1,r);
            }
            
    } 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int a[]= {1,2,3,4,5,6,7,8};
        System.out.println(binarySearch(a, 7));
        System.out.println(binarySearchp(a, 7,0,a.length-1));
    }

==用大O分析二分搜索的算法,可見每次執行一次算法的while循環,搜索數組減少一半,因此最壞情況被執行了O(logn)==
[^1]:大O表示法主要用來
計算算法的時間復雜度

算法:二分搜索法