//二分查找法(折半查找法)
//主要思路:将一个顺序已经排好的数组如从小到大,
//分别取第一位和末位为low和high,取mid为两者位置数的平均值
//输入key,每次在循环中判断key与mid位置数组值大小关系
//若key<mid位置数组的值,则high位置数=mid-1,查找范围缩小一半,下次在[low,mid-1]间寻找
//若key>mid位置数组的值,则low位置数=mid+1,查找范围缩小一半,下次在[mid+1,high]间寻找
//重复上述步骤,不断将key值范围缩小,high和low的位置数逼近相等或十分接近
#include<stdio.h>
int main()
{
int key,mid,high,low;//先定义 key中文意思为答案,high为高位,low为低位
int a[10]={-22,-5,5,7,8,13,14,51,68,77};//随便定义了一些从小到大顺序的数组
//二分法使用条件:数组一定是已经按小到大或大到小的顺序排好
printf("请输入要查找的数:");
scanf("%d",&key);
low=0; high=9; //查找区域初始化(在a[low]~a[high]内查找)
while(low<=high) // 此处是 <= 而不是 < 。记住格式是一个大while里面包含了3个选择条件
{
mid=(high+low)/2;
if(key<a[mid])
high=mid-1;
else if(key>a[mid])
low=mid+1;
else break; //如果等于中间位置的数据,则找到,结束查找。
}
if(low<=high) //找到
printf("%d在数组中的下标为%d\n",key,mid);
else
printf("查无此数"); //未找到
return 0;
}
// 算法大概就是这样,希望读者认真背诵算法的代码,下次遇见直接套上用就OK
//二分法能提高计算机的计算效率,减少计算次数,在处理大数据时十分有效
int BinarySearch(int a[],int size,int p)
{//也可以写一个成子函数的形式,如果找到就放回该值,找不到返回1
int l=0;
int R=size-1;
while(L<=R)
{
int mid=L+(R-L)/2;
if(p==a[mid])
return mid;
else if(p>a[mid])
{
L=mid+1;
}
else
{
R=mid-1;
}
}
return -1;
}
如果喜欢我的文章,请关注我,点赞,谢谢,感谢读者。2021.11.26. 00:32