轻松拿捏C语言——二分查找,轻松掌握C语言二分查找算法

马肤
摘要:,,本文介绍了轻松掌握C语言中的二分查找算法。二分查找是一种高效的搜索算法,适用于已排序的数组或列表。本文将详细介绍二分查找的基本思想、实现步骤和代码示例,帮助读者快速掌握这一重要技能,以便在实际编程中灵活应用。

轻松拿捏C语言——二分查找,轻松掌握C语言二分查找算法 第1张轻松拿捏C语言——二分查找,轻松掌握C语言二分查找算法 第2张 欢迎关注 轻松拿捏C语言系列,和小哇一起进步吧!

感谢大家的阅读、点赞、收藏和关注❤️


目录🎉

一、介绍🌈

二分查找是一种在有序数组中查找某一特定元素的搜索算法。

举个生活中的例子,当我们去图书馆借书时,知道了要找的图书编号,我们可以按照一种有序的方式查找,从中间开始,然后决定是往前找还是往后找,这样就能比一本一本地找更加快速。

搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或小于中间元素,则在数组大于或小于中间元素的那一半中查找。

如果在某一步骤数组为空,则代表找不到,这种搜索算法每一次比较都使搜索范围缩小一半。

二、步骤🌙

  1. 确定搜索范围,即数组的下标范围。
  2. 计算中间元素的下标时,为了避免整数溢出,我们可以采用一种更稳妥的方式:mid = left + (right - left) / 2。

我们还需要考虑一种情况:当数组元素数量非常大时,直接计算中间元素的下标可能会导致整数溢出,为了避免这种情况,我们可以采用另一种计算方法:mid = left + (right + left) / 2,这样可以确保结果始终在正确的范围内。

  1. 判断中间元素与目标值的大小关系,然后进行递归或循环查找。

三、代码☀️

法一:用递归实现

#include <stdio.h>

int binarySearchRecursive(int arr[], int left, int right, int key) {

if (left > right) {

return -1; // 搜索范围无效

}

int mid = left + (right - left) / 2; // 避免溢出的写法

if (arr[mid] == key) {

return mid; // 找到目标,返回下标

} else if (arr[mid] > key) {

return binarySearchRecursive(arr, left, mid - 1, key); // 在左半部分继续搜索

} else {

return binarySearchRecursive(arr, mid + 1, right, key); // 在右半部分继续搜索

}

int main() {

int arr[] = {1, 3, 5, 7, 9};

int key = 5;

int n = sizeof(arr) / sizeof(arr[0]);

int ret = binarySearchRecursive(arr, 0, n - 1, key);

if (ret != -1) {

printf("元素 %d 在数组中的下标为 %d\n", key, ret);

} else {

printf("元素 %d 不在数组中\n", key);

}

return 0;

}

法二:用循环实现

#include <stdio.h>

int binarySearchIterative(int arr[], int N, int key) {

int left = 0;

int right = N - 1;

while (left<= right) { // 注意这里使用小于等于号,确保能够遍历整个数组范围直到找到目标值或确定不存在为止,其他部分与递归实现类似。} return -1; // 未找到目标值}

轻松拿捏C语言——二分查找,轻松掌握C语言二分查找算法 第3张

0
收藏0
文章版权声明:除非注明,否则均为VPS857原创文章,转载或复制请以超链接形式并注明出处。

相关阅读

  • 【研发日记】Matlab/Simulink自动生成代码(二)——五种选择结构实现方法,Matlab/Simulink自动生成代码的五种选择结构实现方法(二),Matlab/Simulink自动生成代码的五种选择结构实现方法详解(二)
  • 超级好用的C++实用库之跨平台实用方法,跨平台实用方法的C++实用库超好用指南,C++跨平台实用库使用指南,超好用实用方法集合,C++跨平台实用库超好用指南,方法与技巧集合
  • 【动态规划】斐波那契数列模型(C++),斐波那契数列模型(C++实现与动态规划解析),斐波那契数列模型解析与C++实现(动态规划)
  • 【C++】,string类底层的模拟实现,C++中string类的模拟底层实现探究
  • uniapp 小程序实现微信授权登录(前端和后端),Uniapp小程序实现微信授权登录全流程(前端后端全攻略),Uniapp小程序微信授权登录全流程攻略,前端后端全指南
  • Vue脚手架的安装(保姆级教程),Vue脚手架保姆级安装教程,Vue脚手架保姆级安装指南,Vue脚手架保姆级安装指南,从零开始教你如何安装Vue脚手架
  • 如何在树莓派 Raspberry Pi中本地部署一个web站点并实现无公网IP远程访问,树莓派上本地部署Web站点及无公网IP远程访问指南,树莓派部署Web站点及无公网IP远程访问指南,本地部署与远程访问实践,树莓派部署Web站点及无公网IP远程访问实践指南,树莓派部署Web站点及无公网IP远程访问实践指南,本地部署与远程访问详解,树莓派部署Web站点及无公网IP远程访问实践详解,本地部署与远程访问指南,树莓派部署Web站点及无公网IP远程访问实践详解,本地部署与远程访问指南。
  • vue2技术栈实现AI问答机器人功能(流式与非流式两种接口方法),Vue2技术栈实现AI问答机器人功能,流式与非流式接口方法探究,Vue2技术栈实现AI问答机器人功能,流式与非流式接口方法详解
  • 发表评论

    快捷回复:表情:
    评论列表 (暂无评论,0人围观)

    还没有评论,来说两句吧...

    目录[+]

    取消
    微信二维码
    微信二维码
    支付宝二维码