折半查找
例:找13
步骤1⃣️:(0+9)/2=4则规定,low=0、mid=4、high=9
步骤2⃣️:将13与mid对应的值进行比较,10<13则将low移动到mid+1的位置上
步骤3⃣️:(5+9)/2=7,则mid=7
步骤4⃣️:将13与mid值进行比较,13<16则将high移动到mid-1的位置上
步骤5⃣️:(5+6)/2=5,则mid=5
步骤6⃣️:13>11,则low=mid+1
步骤7⃣️:(6+6)/2=6则mid=13=13,找到数字13的位置
//在长度为len的数组arr中,查找关键字key,成功返回下标,失败返回-1
int BinSearch(int *arr,int len,int key)
{
int low = 0;
int mid;
int high = len-1;
while(low<=high)
{
mid = (low+high)/2;
if(arr[mid]==key)//找到
{
return mid;
}
else if(arr[mid]<key)//在后半部分找
{
low = mid+1;
}
else//在前半部分找
{
high = mid-1;
}
}
return -1;
}
int main()
{
int arr[] = {1,2,3,4,5,6,7,8,9,10};
for(int i=-1;i<13;i++)
{
printf("%d\n",BinSearch(arr,sizeof(arr)/sizeof(arr[0]),i));
}
return 0;
}
输出结果为:
-1
-1
0
1
2
3
4
5
6
7
8
9
-1
-1