目录
一.运用情景
查找 同一类数据 是否存在?若存在,其位置 在哪?
二.运用条件
一定是 有序 的条件下,从小到大或者从大到小。但是,顺序和倒序影响 if 语句中left和right的变化。
三.运用思路
length为sizeof得到的数组长度
left=0;right=length - 1;
mid=(left+right)/2
如果 a[mid]<k ,说明 a[mid]在k左边,那么left=mid+1 继续比较a[mid]与k
如果a[mid]>k ,说明a[mid]在k的右边,那么right=mid-1 继续比较a[mid]与k而循环的条件是left>right
以上两种情况,用mid做加减,是因为mid上的值已经比较过了,直接赋值mid右一个或者左一个 的值
当right>left的时候,即说明k不存在
四.代码部分
1.引入库
#include<stdio.h>
2.函数部分
注意:while条件含 等于;mid的定义在while里面,每一次循环都重新定义mid;
int search(int k,int a[],int length);
int main()
{
int a[]={1,2,3,4,5,6,7,8,9,10};
int x;
int loc;
printf("请输入一个数字:");
scanf("%d",&x);
loc=search(x,a,sizeof(a)/sizeof(a[0]));
if(loc!=-1)
{
printf("%d在下标为%d的位置\n",x,loc);
} else{
printf("%d不存在\n",x);
}
return 0;
}
int search(int k,int a[],int length)
{
int left=0;
int right=length-1;
int ret=-1;
while(right>=left)
{
int mid=(left+right)/2;
if(a[mid]==k)
{
ret=mid;
break;
}
else if(a[mid]<k)
left=mid+1;
else right=mid-1;
}
return ret;
}
五.执行结果
六.总结
二分查找一定在有序条件下。
倒序和顺序影响left和right的变化,注意left和right的变化。
以上代码得到的结果是数组的下标