1. 程式人生 > >二分查詢/二分搜尋(binary_search)詳解

二分查詢/二分搜尋(binary_search)詳解

前提:

1.不考慮超大資料情況。

2.對於二分查詢/搜尋,要求待查表為有序表。

程式碼:

  1.遞迴方式: 

#include<iostream>
using namespace std;
int binary_search(int a[],int h,int t,int value);
int main()
{
    int a[11]={0,1,2,3,4,5,6,7,8,9,10};
    int len=sizeof(a)/sizeof(a[0]);
    int result = binary_search(a,0,len-1,10);
    cout<<result<<endl;
}
int binary_search(int a[],int h,int t,int value)
{
    if(h>t)
    {

        return -1;
    }

    int mid=(h+t)/2;

    if(value<a[mid]){
        binary_search(a,h,mid-1,value);
    }else if(value>a[mid]){
        binary_search(a,mid+1,t,value);
    }else{

        return mid;
    }

}

  2.非遞迴方式:

#include<iostream>
using namespace std;
int search_binary(int a[],int low,int high,int value);
int main()
{
    int a[11]={0,1,2,3,4,5,6,7,8,9,10};
    int len=sizeof(a)/sizeof(a[0]);
    int result=search_binary(a,0,len-1,2);
    cout<<result<<endl;
}

int search_binary(int a[],int low,int high,int value)
{
    int middle=0;

    while(low<high)
    {
        middle=(low+high)/2;

        if(value>a[middle])
        {
            low=middle+1;
        }else if(value<a[middle]){
            high=middle-1;
        }else{

            return middle;
        }
    }

    return -1;
}

演算法分析:

1.時間複雜度:

       從二分查詢的過程來看,每次比較目標值和當前序列中間元素的值後,都會將當前序列一分為二,繼續在分好的序列中查詢。序列的變化其實就是一個二叉樹的結構。在每一層上面,執行的比較操作都相同,消費時間設為C。 對於一個二叉樹,深度為lgn+1。所以時間總量為:T(n)=Clgn+C。

       時間複雜度為:O(lgn)

2.用法解析:

       優點是比較次數少,查詢速度快,平均效能好;其缺點是要求待查表為有序表,且插入刪除困難。因此,折半查詢方法適用於不經常變動而查詢頻繁的有序列表。