活动地址:CSDN21天学习挑战赛
作者简介:大家好我是小唐同学(๑><๑),为梦想而奋斗的小唐,让我们一起加油!!!
个人主页:小唐同学(๑><๑)的博客主页
系列专栏:数据结构
博友们如果也是新手入门数据结构我希望大家可以多加练习 数据结构题库在牛客网就有已经给大家附上链接,可以直接点击跳转:刷题点这里
牛客网支持ACM模式哦,刷算法题也很推荐哦!!!
下面上文章------》
目录
折半查找也称为二分查找,是一种效率比较高的查找算法,但是这是在该序列已经有序的状态下,因为该算法的核心思想就是缩小搜索区间,也要保持在元素不遗漏的状态下。
(1)n个数(有序数列--升序)
(2)待查找元素
查找成功:返回该元素在有序数列中的下标
查找失败:返回-1或自定义失败的标识
核心思想就是不断缩小搜索范围,在缩小范围时你会遇到三种情况
1.与目标值相等:直接返回对应下标,结束
2.比目标值大:因为数列有序 则中值元素在目标值的后边,搜索区间减半(在左一半),再算出减半后的区间的中值进行比较,以此类推。
3.比目标值小:由于元素有序,则中值元素在目标值的前边,搜索区间减半(在右一半),再算出减半后的区间的中值进行比较,以此类推。
如果区间两端点重合且端点值不相等则表示查找失败。
图片来自《数据结构简明教程》
第一次查找:mid坐标为4,对应元素为10,大于7,则区间变为左一半:[0,3];
第二次查找:mid坐标为1,对应元素为1,小于7,则区间变为右一半:[0,3];
第三次查找:mid坐标为2,对应元素为7,等7,返回下标:mid+1=3;
- # include
- int main()
- {
- int a[7];
- int n;
- printf("请输入要查找的元素");
- scanf("%d",&n);
- printf("请输入数组元素");
- for(int i=0;i<7;i++)
- {
- scanf("%d",&a[i]);
- }
- //存储变化的区间右端点
- int r=6;
- //存储变化的区间左端点
- int l=0;
- int mid;
- while(l<=r)
- {
- mid=(r+l)/2;
- if(a[mid]==n)
- {
- printf("%d",mid);
- return mid;
- }
-