二分法適合數據量很大的數據的查找,該算法要求:該組數據是有序的。
主要思想是:(設查找的數組區間爲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;
}