二分查找的基本原理
二分查找的基本逻辑就是每次找区间的中间数,然后与要查找的数进行比较,不断的缩小区间,最后区间中只剩一个数,即为要查找的数。如果不是,则没有该数。
二分查找只适用于有序数组
以数组中的数从左至右按从小到大依次排列为例
最左端为a[0],最右端为a[len-1],中间数为(left+right)/2,中间数取整数时取大的或小的皆可,此处取小的那个(例如13/2,可取6或7,此处取6)
代码
#include<stdio.h>
int search(int k,int a[], int len)
{
int left = 0;
int right = len-1;
int ret = -1;//当下标为-1时查找失败
while(left <= right)//当左端大于右端时查找失败
{
int mid = (left+right)/2;
if(a[mid] == k )
{
ret = mid;//查找成功时的数组下标
break;
}else if(a[mid]>k)
{
right = mid - 1;
}else{
left = mid +1;
}
}
return ret;
}
int main()
{
int a[]={2,4,7,11,13,16,21,24,27,32,36,40,46};
int k;
printf("请输入要查找的数字:");
scanf("%d",&k);
int len = sizeof(a)/sizeof(a[0]);//求数组长度
int ret = search(k, a, len);
if(ret>-1)
{
printf("找到数字%d\n数组下标为%d", k,ret);
} else
{
printf("没有找到数字%d\n",k);
}
return 0;
}
运行结果