【二分查找】
ide
前提:在一個已序的空間中查找spa
注意:查找邊界條件orm
狀況一:左閉右開 【 ),右邊界始終沒法取到it
假如前開後閉空間 【left,right),好比int array[10]={0,1,2,3,4,5,6,7,8,9};【0,10)class
int BinarySearch (int a[],int size,int data)di
{view
int left=0;vi
int right=size;while
int mid=0; co
while(left<right)//注意此處不能去等號
{
mid=left + (right-left)/2;
if(data<a[mid])
{
right=mid;
}
else if(data>a[mid])
{
left=mid+1;
}
else
{
return mid;
}
}
return -1;
}
假如查找3
1 2 3 4 5 6 7 8 9
第一次 【1,9) mid=4 a[4]>3 縮小右邊界 [0,4)
即直接right=mid;
第二次 【0,4) mid=2 a[2]==3 退出
假如找9
第一次 【0,9) mid=4 a[4]<9 改變左邊界[5,9)
第二次 【5,9)mid=9 a[7]<9 改變左邊界[8,9)
第三次 【8,9)mid=8 a[8]==9 退出
狀況二:左閉右閉 右邊界能夠取到
假如前開後閉空間 【left,right】,好比int array[10]={0,1,2,3,4,5,6,7,8,9};【0,9】
int BinarySearch (int a[],int size,int data)
{
int left=0;
int right=size;
int mid=0;
while(left<right)//注意必須加=號,好比查找最後一個元素
{
mid=left + (right-left)/2;
if(data<a[mid])
{
right=mid-1;
}
else if(data>a[mid])
{
left=mid+1;
}
else
{
return mid;
}
}
return -1;
}
假如查找4
1 2 3 4 5 6 7 8 9
第一次 [0,8] mid =4 a[4]>4 縮小右邊界[0,3]
第二次 [0,3] mid =1 a[1]<4 改變左邊界[2,3]
第三次 [2,3] mid=2 a[2]<4 改變左邊界[3,3]
第四次 [3,3] mid=3