欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 创投人物 > 《二分查找算法:C语言实现与解析》

《二分查找算法:C语言实现与解析》

2025/4/4 4:41:27 来源:https://blog.csdn.net/m0_74357092/article/details/146919324  浏览:    关键词:《二分查找算法:C语言实现与解析》

在这里插入图片描述

🚀个人主页:BabyZZの秘密日记
📖收入专栏:C语言


🌍文章目入

    • 一、什么是二分查找算法
    • 二、代码实现
    • 三、代码解析
      • (一)数组初始化
      • (二)边界初始化
      • (三)循环查找
      • (四)中间索引计算
      • (五)目标值比较
      • (六)未找到目标值的处理
    • 四、运行结果
    • 五、二分查找算法的优缺点
      • (一)优点
      • (二)缺点
    • 六、总结

在计算机科学中,查找算法是解决数据检索问题的重要工具。今天,我们将通过一个简单的C语言程序,深入探讨二分查找算法的实现与原理。这个算法不仅高效,而且在实际应用中非常广泛。

一、什么是二分查找算法

二分查找算法是一种在有序数组中查找特定元素的高效算法。它的基本思想是通过不断将数组分成两半,逐步缩小查找范围,从而快速定位目标元素。与线性查找相比,二分查找的时间复杂度为O(log₂n),大大提高了查找效率。

二、代码实现

以下是一个使用C语言实现的二分查找程序:

#include <stdio.h>
#include <stdbool.h>int main()
{int arr1[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; // 定义一个有序数组int target = 6; // 定义目标值int left = 0; // 初始化左边界int right = sizeof(arr1) / sizeof(arr1[0]) - 1; // 初始化右边界int mid = 0; // 用于存储中间索引bool flag = false; // 标志变量,用于判断是否找到目标值while (left <= right) // 当左边界小于等于右边界时,继续查找{mid = (left + right) / 2; // 计算中间索引if (arr1[mid] < target) // 如果中间值小于目标值{left = mid + 1; // 更新左边界}else if (arr1[mid] > target) // 如果中间值大于目标值{right = mid - 1; // 更新右边界}else // 如果中间值等于目标值{printf("找到了,数组下标是 = %d\n", mid); // 输出目标值的索引flag = true; // 设置标志为truebreak; // 退出循环}}if (flag == false) // 如果标志仍为false,说明未找到目标值{printf("sorry 找不到\n");}return 0;
}

三、代码解析

(一)数组初始化

int arr1[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

这里定义了一个包含10个元素的有序数组arr1。二分查找算法要求数组必须是有序的,否则无法正确执行。

(二)边界初始化

int left = 0;
int right = sizeof(arr1) / sizeof(arr1[0]) - 1;

left表示数组的左边界,初始值为0;right表示数组的右边界,通过sizeof(arr1) / sizeof(arr1[0]) - 1计算得到,即数组的最后一个元素的索引。

(三)循环查找

while (left <= right)

当左边界小于等于右边界时,表示查找范围仍有效,继续执行循环。

(四)中间索引计算

mid = (left + right) / 2;

每次循环中,通过(left + right) / 2计算中间索引mid。这是二分查找的核心步骤,通过将数组分成两半,逐步缩小查找范围。

(五)目标值比较

if (arr1[mid] < target)
{left = mid + 1;
}
else if (arr1[mid] > target)
{right = mid - 1;
}
else
{printf("找到了,数组下标是 = %d\n", mid);flag = true;break;
}
  • 如果arr1[mid] < target,说明目标值在右半部分,更新左边界left = mid + 1
  • 如果arr1[mid] > target,说明目标值在左半部分,更新右边界right = mid - 1
  • 如果arr1[mid] == target,说明找到了目标值,输出其索引并设置标志变量flag = true,然后退出循环。

(六)未找到目标值的处理

if (flag == false)
{printf("sorry 找不到\n");
}

如果循环结束后,标志变量flag仍为false,说明未找到目标值,输出提示信息。

四、运行结果

假设目标值target为6,程序运行结果如下:

找到了,数组下标是 = 5

如果目标值target为11,程序运行结果如下:

sorry 找不到

五、二分查找算法的优缺点

(一)优点

  1. 高效:二分查找的时间复杂度为O(log₂n),相比线性查找的O(n),在大规模数据中查找效率更高。
  2. 简单易实现:算法逻辑清晰,代码实现简单。

(二)缺点

  1. 要求有序数组:二分查找只能在有序数组中使用,如果数组无序,需要先对数组进行排序,这会增加额外的时间开销。
  2. 不适用于动态数据:如果数组中的数据频繁变动,每次查找前都需要重新排序,效率会降低。

六、总结

二分查找算法是一种非常实用的查找算法,尤其适用于有序数组中的查找操作。通过本文的介绍,相信读者已经对二分查找算法有了清晰的认识。在实际开发中,我们可以根据数据的特点和需求,灵活选择合适的查找算法。希望本文对你有所帮助!

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词