简单算法之二分搜索——C语言

简介: 线性搜索效率低下,而二分搜索可以将数组中的数字分为两半,从而提高搜索效率。

二分搜索


前言

线性搜索效率低下,而二分搜索可以将数组中的数字分为两半,从而提高搜索效率。其搜索次数是 log2n

目的

找出目标数字的位置或确认该数字是否存在。

方法

首先需要将数组按照某种次序排序(例如从小到大),然后将目标数字与数组的中位数进行比较。如果比中位数小,则继续比较较小一侧的中位数,循环该过程,直至找到目标数字。

利用函数

int search(int key, int a[], int len)
函数实现

位置 0 1 2 3 4 5 6 7 8 9 10 11 12
数字 0 1 2 3 4 5 6 7 8 9 10 11 12
left mid right
int search(int key, int a[], int len)
{
    int ret = -1;
    int left = 0;
    int right = len - 1;
    while(left <= right)
    {
        int mid = (left + right) / 2;
        if(a[mid] == key)
        {
            ret = mid;
            break;
        }
        else if(a[mid] < key)
        {
            left = mid + 1;
        }
        else
        {
            right = mid - 1;
        }
    }
    return ret;
}

在函数中,首先将返回值 ret 设为 -1,表示未找到目标数字。然后设置左下标变量为 left,右下标为 right,中位数下标为 mid。循环条件为 left <= right。如果 a[mid] < key,则目标数字在其右侧,令 left = mid + 1,right 不变;反之令 right = mid - 1,left 不变,因为 mid 是中位数,所以其会随 left 和 right 的改变而改变。最终返回值 ret 即为目标数字的位置。

运行程序

int main()
{
    int key;
    scanf("%d", &key);
    int a[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
    int r = search(key, a, sizeof(a) / sizeof(a[0]));
    printf("%d", r);
    return 0;
}

在主函数中,利用 sizeof 计算数组长度。然后输入目标数字并进行搜索,最后输出目标数字的位置。

全部代码

#include <stdio.h>
int search(int key, int a[], int len)
{
    int ret = -1;
    int left = 0;
    int right = len - 1;
    while(left <= right)
    {
        int mid = (left + right) / 2;
        if(a[mid] == key)
        {
            ret = mid;
            break;
        }
        else if(a[mid] < key)
        {
            left = mid + 1;
        }
        else
        {
            right = mid - 1;
        }
    }
总结

在这篇博客中,我们学习了二分搜索算法的原理和实现方法。二分搜索是一种高效的搜索算法,可以将数组中的数字分为两半,一半一半进行搜索,从而提高搜索效率,搜索次数为 log2n


我们了解了二分搜索算法的目的和方法,即将数组按照某种次序排序,然后将目标数字与数组的中位数进行比较,如比中位数小,则继续比较较小一侧的中位数,直至找到目标数字。同时,我们也学习了如何利用函数实现二分搜索算法,并详细解释了函数中的每一步骤。


为了更好地理解二分搜索算法的实现过程,我们还编写了一个简单的C语言程序,并讲解了其实现细节,例如如何计算数组长度、如何设置循环条件等等。


最后,我们总结了本文的主要内容,包括二分搜索算法的目的和方法、如何利用函数实现算法、C语言程序的实现过程等,希望读者能够通过本文的学习更好地掌握二分搜索算法,并将其应用到实际的问题中去。 (如有错误敬请斧正,感谢观看)

相关文章
|
3月前
|
存储 算法 C语言
"揭秘C语言中的王者之树——红黑树:一场数据结构与算法的华丽舞蹈,让你的程序效率飙升,直击性能巅峰!"
【8月更文挑战第20天】红黑树是自平衡二叉查找树,通过旋转和重着色保持平衡,确保高效执行插入、删除和查找操作,时间复杂度为O(log n)。本文介绍红黑树的基本属性、存储结构及其C语言实现。红黑树遵循五项基本规则以保持平衡状态。在C语言中,节点包含数据、颜色、父节点和子节点指针。文章提供了一个示例代码框架,用于创建节点、插入节点并执行必要的修复操作以维护红黑树的特性。
99 1
|
3月前
|
算法
【算法】二分算法——搜索插入位置
【算法】二分算法——搜索插入位置
|
2天前
|
搜索推荐 算法 C语言
【排序算法】八大排序(上)(c语言实现)(附源码)
本文介绍了四种常见的排序算法:冒泡排序、选择排序、插入排序和希尔排序。通过具体的代码实现和测试数据,详细解释了每种算法的工作原理和性能特点。冒泡排序通过不断交换相邻元素来排序,选择排序通过选择最小元素进行交换,插入排序通过逐步插入元素到已排序部分,而希尔排序则是插入排序的改进版,通过预排序使数据更接近有序,从而提高效率。文章最后总结了这四种算法的空间和时间复杂度,以及它们的稳定性。
26 8
|
2天前
|
搜索推荐 算法 C语言
【排序算法】八大排序(下)(c语言实现)(附源码)
本文继续学习并实现了八大排序算法中的后四种:堆排序、快速排序、归并排序和计数排序。详细介绍了每种排序算法的原理、步骤和代码实现,并通过测试数据展示了它们的性能表现。堆排序利用堆的特性进行排序,快速排序通过递归和多种划分方法实现高效排序,归并排序通过分治法将问题分解后再合并,计数排序则通过统计每个元素的出现次数实现非比较排序。最后,文章还对比了这些排序算法在处理一百万个整形数据时的运行时间,帮助读者了解不同算法的优劣。
20 7
|
5天前
|
算法 搜索推荐 数据库
二分搜索:高效的查找算法
【10月更文挑战第29天】通过对二分搜索的深入研究和应用,我们可以不断挖掘其潜力,为各种复杂问题提供高效的解决方案。相信在未来的科技发展中,二分搜索将继续发挥着重要的作用,为我们的生活和工作带来更多的便利和创新。
11 1
|
1月前
|
算法 决策智能
基于禁忌搜索算法的VRP问题求解matlab仿真,带GUI界面,可设置参数
该程序基于禁忌搜索算法求解车辆路径问题(VRP),使用MATLAB2022a版本实现,并带有GUI界面。用户可通过界面设置参数并查看结果。禁忌搜索算法通过迭代改进当前解,并利用记忆机制避免陷入局部最优。程序包含初始化、定义邻域结构、设置禁忌列表等步骤,最终输出最优路径和相关数据图表。
|
2月前
|
大数据 UED 开发者
实战演练:利用Python的Trie树优化搜索算法,性能飙升不是梦!
在数据密集型应用中,高效搜索算法至关重要。Trie树(前缀树/字典树)通过优化字符串处理和搜索效率成为理想选择。本文通过Python实战演示Trie树构建与应用,显著提升搜索性能。Trie树利用公共前缀减少查询时间,支持快速插入、删除和搜索。以下为简单示例代码,展示如何构建及使用Trie树进行搜索与前缀匹配,适用于自动补全、拼写检查等场景,助力提升应用性能与用户体验。
50 2
|
1月前
|
存储 算法 C++
【搜索算法】 跳马问题(C/C++)
【搜索算法】 跳马问题(C/C++)
|
1月前
|
人工智能 算法 Java
【搜索算法】数字游戏(C/C++)
【搜索算法】数字游戏(C/C++)
|
3月前
|
机器学习/深度学习 算法 文件存储
【博士每天一篇文献-算法】 PNN网络启发的神经网络结构搜索算法Progressive neural architecture search
本文提出了一种名为渐进式神经架构搜索(Progressive Neural Architecture Search, PNAS)的方法,它使用顺序模型优化策略和替代模型来逐步搜索并优化卷积神经网络结构,从而提高了搜索效率并减少了训练成本。
53 9
下一篇
无影云桌面