C语言之二分查找法或折半查找法剖析(经典例题,经典解析)
二分查找法(也叫折半查找法):
- 什么是二分查找?
- 具体查找的方式?
- 两种方法剖析
- 易错点列举
先举例题:
int arr[]={1,2,3,4,5,6,7,8,9,10};
找出7所在的位置。
分析之前我们先了解下面的知识:
什么是二分查找?
二分查找,也称折半查找,在某些情况下相比于顺序查找,使用折半查找算法的效率更高。但是该算法的使用的前提是静态查找表中的数据必须是有序的。
具体查找的方式?
我们设key为想要查找的数字
- 找到数组的中间位置
- 检测中间位置的数据是否与要查找的数据key相等
a: 相等,找到,打印下标,跳出循环
b: key < arr[mid], 则key可能在arr[mid]的左半侧,继续到左半侧进行二分查找
c: key > arr[mid], 则key可能在arr[mid]的右半侧,继续到右半侧进行二分查找 - 如果找到返回下标,否则继续,直到区间中没有元素时,说明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;
}
易错点列举
- right的右半侧区间取值,该值决定了后序的写法
- while循环的条件是否有等号
- 求中间位置的方法,直接相加除2容易造成溢出
- 更改left和right的边界时,不确定是否要+1和-1
C语言之二分查找法或折半查找法剖析(经典例题,经典解析)相关推荐
- 递归法实现折半查找(二分查找)
题目 递归法实现折半查找(二分查找) 分析 设立low代表数组最小端的数组下标,high代表数组最大端的数组下标,mid代表数组中间值的数组下标 查询数字number与mid进行比较,有四种情况: 1 ...
- 每日C语言(The 7th day)——折半查找法
太久没有更新了,偷懒了,趁着开学前多发几篇(偷笑) 老样子先上题目 T(题目):假设有若干个由大到小排序的数已经顺序存放在一个数组中,现输入一个数x,请用折半查找法找出该数是数组中哪个元素的值.找到则 ...
- 二分查找算法(折半查找算法)
二分查找算法(折半查找算法) 二分查找又称折半查找.二分搜索.折半搜索等,是在分治算法基础上设计出来的查找算法,对应的时间复杂度为O(logn). 二分查找算法仅适用于有序序列,它只能用在升序序列或者 ...
- 查找算法:折半查找算法实现及分析
折半查找算法介绍 折半查找(Binary Search)又称为二分查找.它的前提是线性表中的记录必须是关键码有序(通常从小到大有序),线性表必须采用顺序存储.从算法名称可以看出算法的思路,先取有序序列 ...
- 数据结构之查找算法:折半查找
查找算法:折半查找 思维导图: 算法思想: 代码实现: 判定树: 折半查找判定树的构造: 顺序查找与折半查找对比: 思维导图: 算法思想: 代码实现: typedef struct {int *ele ...
- 数据结构-顺序查找的二分查找法(折半查找)
折半查找要求顺序表中的元素必须是排好序的,即数组中的元素是由小到大排好序的 思想: 1.以数组的边界确定low和high的值,low就是最低的0,high就是最高的n-1(n是元素的个数),这里的lo ...
- 对分查找法(二分查找法,折半查找法)
二分查找法是针对已经排好序的序列进行查找 每次折半查找 算法时间复杂度,对于长度为N的序列,每次执行N/2,假设k次结束,最后到第一个N/2^k=0,所以k=logN 时间复杂度logN int bi ...
- 【算法学习】四 二分法查找(折半法或者折半查找)
前言 社长,一个爱学习,爱分享的程序猿,始终相信,付出总会有回报的.知识改变命运,学习成就未来.爱拼才会赢! 程序猿学社的GitHub,已整理成相关技术专刊,欢迎Star:. https://gith ...
- 查找——1、折半查找法
1.折半查找又称为二分查找,是一种效率较高的查找方法. 2.折半查找的前提条件: 查找表中的所有记录是按关键字有序(升序或降序) . 查找过程中,先确定待查找记录在表中的范围,然后逐步缩小范围(每次将 ...
最新文章
- PS教程第十二课:会打开 会关闭我会了
- 从wireshake分析http和https的通信过程
- java堆是gc管理_JVM内存管理及GC机制
- 【后缀数组】bzoj2217 Secretary
- 各国“未雨绸缪”致网络安全陷入困境 安全防御诱发“防御性入侵”
- 打开带图片的EXCEL文档反应慢 案例解析
- Java中判断String不为空的问题性能比较
- 调试笔记:BSOD 0xA
- python的分号用英文还是中文_中文的分号和英文的分号使用方法有区别吗?
- jsonp跨域原理解析
- 王祥林 计算机专业英语答案,计算机专业英语 第3版 配套习题 作者 王祥林 陈静姣 模拟试题1.doc...
- 入手评测 联想小新PRO14,华硕灵耀14s和联想YOGA14s选哪个
- 程序员都会的五大算法之三(贪心算法),恶补恶补恶补!!!
- HDU 4379 - The More The Better
- lect02_codes05_概率论
- 饿死也别进外包公司!说好不加班才入职,结果连续工作10小时,提出辞职后,外包公司竟以时间短为理由拒绝给工资!...
- Geoffrey Hinton:放弃反向传播,我们的人工智能需要重头再来
- 火狐浏览器的全屏兼容问题 allowfullscreen=true
- 高效的产品可视化设计(非原创)
- 5种方法计算均方位移MSD