二分法查找

二分法適合數據量很大的數據的查找,該算法要求:該組數據是有序的。

主要思想是:(設查找的數組區間爲array[low,high])
(1)確定該期間的中間位置K
(2)將查找的值T與array[k]比較。若相等,查找成功返回此位置;否則確定新的查找區域,繼續二分查找。其算法的時間複雜度爲log(n).

剛寫二分法時,考慮片刻,寫下如下代碼(注意:有bug):

int bisection(int *p,int size,int n)
{
    int i,j,k;
    i=0;
    j=size-1;
    k=(i+j)/2;
    while(i<j)  
    {
        if(p[k]>n)
        {
            j=k;
            k=(i+j)/2;
        }
        else if(p[k]<n)
        {
            i=k;
            k=(i+j)/2;
        }
        else
            return k;
    }
    return -1;
}

測試用例

int main()
{
    int a[10]={1,2,3,4,5,6,7,8,9,10};
    int b = bisection(a,10,5);
    printf("%d",b);
}

測試結果,似乎一切正常,但是,但測試到數組的最後一個元素時,程序進入死循環,斷點調試查看,發現當程序運行到i=8,j=9時,k=(i+j)/2一直爲8,導致死循環。是一個典型的邊界條件未滿足導致的bug。

如下修改代碼:

int bisection(int *p,int size,int n)
{
    int i,j,k;
    i=0;
    j=size-1;
    k=(i+j)/2;
    while(i<j) 
    {
        if(p[k]>n)
        {
            j=k-1;     //修改這裏
            k=(i+j)/2;
        }
        else if(p[k]<n)
        {
            i=k+1;     //修改這裏
            k=(i+j)/2;
        }
        else
            return k;
    }
    return -1;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章