二分查找法(也叫折半查找法):

  • 什么是二分查找?
  • 具体查找的方式?
  • 两种方法剖析
  • 易错点列举

先举例题:

int arr[]={1,2,3,4,5,6,7,8,9,10};
找出7所在的位置。

分析之前我们先了解下面的知识:

什么是二分查找?

二分查找,也称折半查找,在某些情况下相比于顺序查找,使用折半查找算法的效率更高。但是该算法的使用的前提是静态查找表中的数据必须是有序的。

具体查找的方式?

我们设key为想要查找的数字

  1. 找到数组的中间位置
  2. 检测中间位置的数据是否与要查找的数据key相等
    a: 相等,找到,打印下标,跳出循环
    b: key < arr[mid], 则key可能在arr[mid]的左半侧,继续到左半侧进行二分查找
    c: key > arr[mid], 则key可能在arr[mid]的右半侧,继续到右半侧进行二分查找
  3. 如果找到返回下标,否则继续,直到区间中没有元素时,说明key不在集合中。

两种方法剖析

方法1:采用[left,right]区间:

#include <stdio.h>
int main()
{int arr[] = { 1,2,3,4,5,6,7,8,9,10 };int key = 3;int left = 0;int right = sizeof(arr) / sizeof(arr[0]) - 1; // right位置的数据可以取到while (left <= right) // right位置有数据,必须要添加=号{int mid = left + (right - left) / 2;if (arr[mid] > key) // key小于中间位置数据,说明key可能在左半侧,需要改变右边界{right = mid - 1; // right位置的数据可以取到,因此right=mid-1}else if (arr[mid] < key)// key大于中间位置数据,说明key可能在右半侧,需要改变左边界{left = mid + 1; // left位置的数据可以取到,因此left=mid+1}else{printf("找到了,下标是:%d\n", mid);break;}}if (left > right)printf("找不到\n");return 0;
}

方法二:采用[left,right)区间:(注意跟上面那个的区别)

#include <stdio.h>
int main()
{int arr[] = { 1,2,3,4,5,6,7,8,9,10 };int key = 3;int left = 0;int right = sizeof(arr) / sizeof(arr[0]); // right位置的数据取不到while (left < right) // right位置没有数据,此处不需要添加={int mid = left + (right - left) / 2;if (arr[mid] > key) // key小于中间位置数据,说明key可能在左半侧,需要改变右边界{right = mid; // right位置的数据取不到,因此right=mid,不需要减1}else if (arr[mid] < key)// key大于中间位置数据,说明key可能在右半侧,需要改变左边界{left = mid + 1; // left位置的数据可以取到,因此left=mid+1}else{printf("找到了,下标是:%d\n", mid);break;}}if (left >= right)printf("找不到\n");return 0;
}

易错点列举

  1. right的右半侧区间取值,该值决定了后序的写法
  2. while循环的条件是否有等号
  3. 求中间位置的方法,直接相加除2容易造成溢出
  4. 更改left和right的边界时,不确定是否要+1和-1

C语言之二分查找法或折半查找法剖析(经典例题,经典解析)相关推荐

  1. 递归法实现折半查找(二分查找)

    题目 递归法实现折半查找(二分查找) 分析 设立low代表数组最小端的数组下标,high代表数组最大端的数组下标,mid代表数组中间值的数组下标 查询数字number与mid进行比较,有四种情况: 1 ...

  2. 每日C语言(The 7th day)——折半查找法

    太久没有更新了,偷懒了,趁着开学前多发几篇(偷笑) 老样子先上题目 T(题目):假设有若干个由大到小排序的数已经顺序存放在一个数组中,现输入一个数x,请用折半查找法找出该数是数组中哪个元素的值.找到则 ...

  3. 二分查找算法(折半查找算法)

    二分查找算法(折半查找算法) 二分查找又称折半查找.二分搜索.折半搜索等,是在分治算法基础上设计出来的查找算法,对应的时间复杂度为O(logn). 二分查找算法仅适用于有序序列,它只能用在升序序列或者 ...

  4. 查找算法:折半查找算法实现及分析

    折半查找算法介绍 折半查找(Binary Search)又称为二分查找.它的前提是线性表中的记录必须是关键码有序(通常从小到大有序),线性表必须采用顺序存储.从算法名称可以看出算法的思路,先取有序序列 ...

  5. 数据结构之查找算法:折半查找

    查找算法:折半查找 思维导图: 算法思想: 代码实现: 判定树: 折半查找判定树的构造: 顺序查找与折半查找对比: 思维导图: 算法思想: 代码实现: typedef struct {int *ele ...

  6. 数据结构-顺序查找的二分查找法(折半查找)

    折半查找要求顺序表中的元素必须是排好序的,即数组中的元素是由小到大排好序的 思想: 1.以数组的边界确定low和high的值,low就是最低的0,high就是最高的n-1(n是元素的个数),这里的lo ...

  7. 对分查找法(二分查找法,折半查找法)

    二分查找法是针对已经排好序的序列进行查找 每次折半查找 算法时间复杂度,对于长度为N的序列,每次执行N/2,假设k次结束,最后到第一个N/2^k=0,所以k=logN 时间复杂度logN int bi ...

  8. 【算法学习】四 二分法查找(折半法或者折半查找)

    前言 社长,一个爱学习,爱分享的程序猿,始终相信,付出总会有回报的.知识改变命运,学习成就未来.爱拼才会赢! 程序猿学社的GitHub,已整理成相关技术专刊,欢迎Star:. https://gith ...

  9. 查找——1、折半查找法

    1.折半查找又称为二分查找,是一种效率较高的查找方法. 2.折半查找的前提条件: 查找表中的所有记录是按关键字有序(升序或降序) . 查找过程中,先确定待查找记录在表中的范围,然后逐步缩小范围(每次将 ...

最新文章

  1. PS教程第十二课:会打开 会关闭我会了
  2. 从wireshake分析http和https的通信过程
  3. java堆是gc管理_JVM内存管理及GC机制
  4. 【后缀数组】bzoj2217 Secretary
  5. 各国“未雨绸缪”致网络安全陷入困境 安全防御诱发“防御性入侵”
  6. 打开带图片的EXCEL文档反应慢 案例解析
  7. Java中判断String不为空的问题性能比较
  8. 调试笔记:BSOD 0xA
  9. python的分号用英文还是中文_中文的分号和英文的分号使用方法有区别吗?
  10. jsonp跨域原理解析
  11. 王祥林 计算机专业英语答案,计算机专业英语 第3版 配套习题 作者 王祥林 陈静姣 模拟试题1.doc...
  12. 入手评测 联想小新PRO14,华硕灵耀14s和联想YOGA14s选哪个
  13. 程序员都会的五大算法之三(贪心算法),恶补恶补恶补!!!
  14. HDU 4379 - The More The Better
  15. lect02_codes05_概率论
  16. 饿死也别进外包公司!说好不加班才入职,结果连续工作10小时,提出辞职后,外包公司竟以时间短为理由拒绝给工资!...
  17. Geoffrey Hinton:放弃反向传播,我们的人工智能需要重头再来
  18. 火狐浏览器的全屏兼容问题 allowfullscreen=true
  19. 高效的产品可视化设计(非原创)
  20. 5种方法计算均方位移MSD

热门文章

  1. Hexo(sakura)背景动画、壁纸、通讯栏(自定义样式)
  2. 【跟着达叔学Java】系列文章更新
  3. 闪亮滴眼液用AR“轰炸”医药零售潮时代,开启创意营销新指南
  4. Android实现获取验证码的倒计时功能
  5. 西门子PLC模拟量滤波程序,西门子1200和1500通用,有电压或者电流或者热电偶选择
  6. python程序运行时间方法的更替
  7. codeigniter如何开启关闭调试模式?
  8. HP LaserJet P2015d 打印机的使用问题
  9. javaweb西蒙购物 中
  10. aaaaaaaaabbbbbbbbbbbbbbbccccccccccccccccc