二分查找概念
在 有序表里,取一个中间数值为比较对象,如果查找的值与中间的值相等,那么便是查找成功。
如果小于中间的值,那么就在的左半区的中间值查找。反之,大于便在右半区的中间值查找。直到找到目标值。
int low=0,high=数组元素-1;//因为数组里下标是从0开始的
while(low<high)//low始终小于high,以防交错
{
int mid=(low+high)/2//求出中间值,放在循环里是因为要不断的判断后在该区域求出中间值
if(arr[mid]==target)//arr数字,target目标制
{
int index=mid//找出目标值的下标,并结束循环
break;
}
else if(arr[mid]<target)
{
low=mid+1;//小于目标值那么就前进一位
}else
{
high=mid-1;//反之
}
}
完整代码
#include <stdio.h>
int main()
{
int arr[]={1,3,6,11,45,64,76,83,91,101};
int number=sizeof(arr)/sizeof(int);
int target;
printf("输入你要查找的数字 ");
scanf("%d",&target);//查找的数字
int mid,low=0,high=number-1,index=-1;
while(low<=high)//循环条件
{
mid=(low+high)/2;//求出中间数
if(arr[mid]==target)
{
index=mid;
break;
}
else if(arr[mid]<target)//找到的值比目标值小
{
low = mid+1;//那么low往前移动一位
}
else
{
high = mid-1;//反之,找到的值比目标值大,那就缩进一位
}
}
if(index==-1)
{
printf("没有找到\n");
}
else
{
printf("在数组的第%d位",index);
}
return 0;
}
数组里的数必须有序!
比顺序查找速度快很多