二分查找(折半查找)
前提条件:
1.是在该数列有序的情况下进行(升序或降序)。
2.只能查找一个数。
思想:按照折中的方法将要找的数据范围通过折半的方法不断压缩,缩减掉一半的查找范围,再从剩余的数据中折不断通过折半的方法压缩减掉一半的查找范围,直到找到该数为止。
优点:极大的提高了其效率
图片解析:![](https://i-blog.csdnimg.cn/blog_migrate/330f95d029e7cb898616859b81cd6ca6.png#pic_center)
#include<stdio.h>
int main()
{
int a[] = { 1,2,3,4,5,6,7,8,9,10 };//一串已知的整形有序数组
int x , left = 0, //最左边数的下标
right = sizeof(a) / sizeof(a[0]) - 1;//最右边数的下标
scanf("%d", &x); //输入你要查找的数;
while (left <= right) //数组的最小下标不可能超过最后一个数组的下标 如果超过则说明已经越界了在这代表着要查询的数不存在
{
int mid = left+(right-left)/2;//开始折中查找,定位到最中间的数后开始比较
if (x < a[mid]) //如果中间的这个数 比你要查找的数小
{ //则会将大于或等于这个中间数的数据全部抛弃从剩下的数中继续折中查找
right = mid-1; //将剩下数的最右边数组的下标重新赋值;
}
if (x > a[mid]) //同理如果中间的这个数,比你要查找的数大
{ //则会将小于或等于中间数的数据全部抛弃从剩下的数中继续折中查找
left = mid+1; //将剩下数的最左边的数组的下标重新赋值
}
if(x == a[mid]) //如果你输入的数恰好等于中间这个数,则已经找到了该数 可以将其位置输出
{
printf("该数的下标是%d\n", mid);
break; //找到后可以中断循环查找
}
}
if (left > right) //当你查找的过程中最左边数的下标超过了数组最右边数的数组的下标时
{ //则代表该数组中没有该数的存在
printf("该数不存在当前数组中");
}
return 0;
}