每天学习一个基础算法之二分查找

ops/2024/10/22 23:30:52/

目录

前言:

1、对二分查找概念的诠释

2、二分查找的使用场景

3、对比顺序查找与二分查找时间复杂度

4、二分查找的实现代码

代码主体(以接口函数的形式)

实现思路:

测试部分(主函数调用)

调试结果


前言:

前一篇博客我们已经介绍学习了顺序查找法,它在对有序数据查找时效率较低,而当我们要对有序数据进行查找时就要用到二分查找法了,所以今天我们要学习的就是二分查找法。

1、对二分查找概念的诠释

二分查找也称折半查找,二分查找从数据结构的中间位置开始,如果中间位置的数据正好与给定数据相同,则查找成功;否则利用中间位置将数据分成前后两个部分,如果中间元素大于给定的数据,则继续在前一半数据中查找,否则继续在后一半数据中查找,重复此操作,直到找到与给定数据相同的数据或全部数据找完。

2、二分查找的使用场景

二分查找比顺序查找的效率高,但它必须要求待查找的数据的结构是有序排列的,适用于不经常变动且查找频率较高的有序数据

3、对比顺序查找与二分查找时间复杂度

顺序查找上篇博客已经说了其本质上就是对数组进行遍历,所以顺序查找的时间复杂度为O(N),而二分查找的时间复杂度为O(log2n),这意味着在最坏的情况下,算法的执行时间与以2为底的目标值的对数成正比,这使得二分查找在处理大规模数据时非常高效。

4、二分查找的实现代码

代码主体(以接口函数的形式)

//二分查找法的实现
static int binary_seek(int arr[], int sz, int target)
{int left = 0;int right = sz - 1;while (left <= right){int mid = (left + right) / 2;if (arr[mid] > target){right = mid - 1;}else if (arr[mid] < target){left = mid + 1;}else{return mid;}}return -1;
}

实现思路:

和前一篇博客顺序查找相同,我采取的方式仍为若找到与给定值相同的数据,返回其下标,若最终找完所有数据还没找到则返回-1。

在程序中,我用left代表排查数据段首元素地址right代表排查数据段末尾元素地址;用mid代替排查数据段中间元素地址

根据概念的理解

如果中间位置的数据正好与给定数据相同对应:

return mid;

 如果中间元素大于给定的数据,则继续在前一半数据中查找对应:

right = mid - 1;

否则继续在后一半数据中查找对应:

left = mid + 1;

测试部分(主函数调用)

int main()
{int arr[] = { 1,2,3,4,5,6,7,8,9,10 };int sz = sizeof(arr) / sizeof(arr[0]);int ret = binary_seek(arr, sz, 7);if (ret != -1){printf("下标为%d\n", ret);}else{printf("没找到!\n");}return 0;
}

调试结果

 

每日一学,今天你又超过了百分之九十九的人。

如果本篇文章对你有帮助,请点个关注和赞吧!

若是对本文有什么独特的见解,也可以在评论区进行讨论。


http://www.ppmy.cn/ops/105398.html

相关文章

【算法每日一练及解题思路】判断字符串是否包含数字

【算法每日一练及解题思路】判断字符串是否含数字 一、题目&#xff1a;给定一个字符串&#xff0c;找出其中不含重复字符的最长子串的长度 二、举例&#xff1a; 比如"abcdefgh",不含数字&#xff1b;比如"1",含数字&#xff1b;比如"a1s",含…

第二证券:涨停潮!传手机将使用钛金属外壳?

今天早盘&#xff0c;银行股再度重挫&#xff0c;导致上证指数、上证50纷乱创出阶段性新低&#xff0c;上证指数跌破2800点&#xff0c;小盘成长股则大面积反弹&#xff0c;创业板指、科创50等股指飘红。 盘面上&#xff0c;新式烟草、钛金属、锂矿、玻璃基板等板块涨幅居前&a…

css改变鼠标样式

要在网页上改变鼠标的样式&#xff0c;你可以使用 CSS 的 cursor 属性。这个属性允许你为网页上的不同元素设置不同的鼠标指针样式。以下是一些常见的 cursor 属性值和使用示例&#xff1a; 常见的 cursor 属性值 默认指针 cursor: default;用于通常情况下的鼠标指针。 手形指…

理解 `break` 和 `continue` 语句的区别:详解与代码示例

在C语言中&#xff0c;break和continue语句是用于控制循环执行流程的重要工具。虽然它们都能改变循环的正常执行顺序&#xff0c;但它们的作用和使用场景有显著的区别。本文将详细探讨break和continue语句的功能、它们的区别&#xff0c;并通过具体的代码示例进行说明。 1. br…

电脑错误mfc140.dll丢失怎么办?mfc140.dll丢失如何修复?

在使用基于Microsoft Visual Studio 2015开发的应用程序时&#xff0c;可能会遇到个别组件影响整体功能的情况&#xff0c;其中“mfc140.dll丢失”错误就是常见的一个技术障碍。这个DLL文件属于Microsoft Foundation Class (MFC) Library&#xff0c;它对Windows应用程序的运行…

QT教程-十七,QTextBrowser

QTextBrowser 是 Qt 框架中的一个小部件&#xff0c;继承自 QTextEdit&#xff0c;用于显示和编辑富文本&#xff08;包括 HTML 格式&#xff09;。它提供了更多的功能&#xff0c;比如支持超链接、内嵌图片、和简单的格式化文本。 一&#xff0c;常用功能和属性 显示 HTML 内…

uniapp网站和微信小程序 添加 百度统计

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、首先&#xff0c;需要在百度统计平台注册一个账户或登录现有的账户二、新建站点(应用)、添加代码三、代码获取与安装1.在官方网站 新增应用&#xff0c;根据官方…

【Kubernetes知识点问答题】Service 发现

目录 1. Kubernetes 如何在集群的 Pod 之间提供网络服务&#xff1f; 2. 解释 iptables 和 IPVS 代理模式 Service 的区别。 3. 举例说明 ClusterIP 类型 Service 的用法。 4. 举例说明 NodePort 类型 Service 的用法。 5. 举例说明 Headless 类型 Service 的用法。 6. 详…