C语言-二分查找

embedded/2024/10/18 8:19:21/

 二分查找

二分查找(Binary Search)是一种在有序数组中查找特定元素的搜索算法。它的工作原理是将数组分为两半,然后根据目标值与中间元素的关系,决定在左半部分还是右半部分继续搜索,直到找到目标值或者搜索范围为空。
二分查找算法的基本步骤如下:
1. 确定查找范围,初始时为整个数组。
2. 在查找范围内找到中间元素。
3. 比较中间元素与目标值:
   - 如果中间元素等于目标值,则查找成功,返回中间元素的索引。
   - 如果目标值小于中间元素,则在左半部分继续查找。
   - 如果目标值大于中间元素,则在右半部分继续查找。
4. 重复步骤2和3,直到找到目标值或者查找范围为空。
二分查找的时间复杂度为 \( O(\log n) \),其中 \( n \) 是数组的长度。这是因为每次迭代可以将查找范围减少一半。
下面是一个简单的二分查找

#include <stdio.h>// 函数声明
int binarySearch(int arr[], int size, int target);int main() {int arr[] = {1, 3, 5, 7, 9, 11, 13, 15, 17, 19};int target = 7;int size = sizeof(arr) / sizeof(arr[0]);int index = binarySearch(arr, size, target);if (index != -1) {printf("Element found at index %d\n", index);} else {printf("Element not found in the array\n");}return 0;
}// 函数定义
int binarySearch(int arr[], int size, int target) {int low = 0;int high = size - 1;int mid;while (low <= high) {mid = (low + high) / 2;  // C 语言中的整数除法if (arr[mid] == target) {return mid;} else if (arr[mid] < target) {low = mid + 1;} else {high = mid - 1;}}return -1;  // 目标值不在数组中
}

在这个例子中,我们定义了一个 binarySearch 函数,它接受一个整数数组 arr、数组的大小 size 和要查找的目标值 target。函数返回目标值在数组中的索引,如果目标值不在数组中,则返回 -1。在 main 函数中,我们创建了一个有序数组 arr,并调用 binarySearch 函数来查找目标值 target。如果找到目标值,它将打印出目标值的索引;如果没有找到,它将打印出目标值不在数组中的消息。

代码的解释

这段代码是一个简单的 C 语言程序,它使用二分查找算法在给定的数组中查找一个特定的目标值。以下是代码的逐行解释:
 

#include <stdio.h>


这行代码是预处理器指令,它告诉编译器包含标准输入输出头文件 `stdio.h`,这个文件包含了标准输入输出函数,如 `printf` 和 `scanf`。

// 函数声明
int binarySearch(int arr[], int size, int target);


这行代码是函数声明,它声明了一个名为 `binarySearch` 的函数,该函数接受三个整数参数:一个整数数组 `arr`、数组的大小 `size` 和目标值 `target`。函数返回一个整数,表示目标值在数组中的索引,如果目标值不在数组中,则返回 -1。

int main() {
    int arr[] = {1, 3, 5, 7, 9, 11, 13, 15, 17, 19};
    int target = 7;
    int size = sizeof(arr) / sizeof(arr[0]);
    int index = binarySearch(arr, size, target);

`main` 函数是程序的入口点。它首先定义了一个整数数组 `arr` 和一个整数 `target`,然后计算数组的大小 `size`,最后调用 `binarySearch` 函数来查找目标值,并将返回的索引存储在变量 `index` 中。

    if (index != -1) {
        printf("Element found at index %d\n", index);
    } else {
        printf("Element not found in the array\n");
    }

这部分代码使用条件语句来检查 `binarySearch` 函数是否找到了目标值。如果找到了,它将打印出目标值在数组中的索引;如果没有找到,它将打印出目标值不在数组中的消息。

    return 0;
}

`main` 函数的返回值是 0,这表示程序正常结束。

// 函数定义
int binarySearch(int arr[], int size, int target) {
    int low = 0;
    int high = size - 1;
    int mid;

这部分代码是 `binarySearch` 函数的定义。它首先定义了三个整数变量:`low`、`high` 和 `mid`。`low` 初始化为数组的第一个元素的索引(即 0),`high` 初始化为数组的最后一个元素的索引(即 `size - 1`)。`mid` 用于存储中间元素的索引。

    while (low <= high) {
        mid = (low + high) / 2;  // C 语言中的整数除法
        if (arr[mid] == target) {
            return mid;
        } else if (arr[mid] < target) {
            low = mid + 1;
        } else {
            high = mid - 1;
        }
    }

这部分代码是一个循环,它重复执行以下步骤,直到 `low` 大于 `high`:
1. 计算中间元素的索引 `mid`。
2. 检查中间元素是否等于目标值。如果是,则返回中间元素的索引。
3. 如果中间元素小于目标值,则将 `low` 设置为 `mid + 1`,并继续搜索数组的右半部分。
4. 如果中间元素大于目标值,则将 `high` 设置为 `mid - 1`,并继续搜索数组的左半部分。

    return -1;  // 目标值不在数组中
}

如果循环完成而没有找到目标值,函数返回 -1,表示目标值不在数组中。
总结来说,这段代码定义了一个二分查找函数,并在 `main` 函数中使用该函数在一个已排序的整数数组中查找一个特定的目标值,并打印出结果。

 

图解

一次干掉一半

前提是有序

折半查找

找一次,去掉一半

在有序的数字里,查找某一个数字

找到了

数值在左边

数值在右边

方法一(循环查找) 

方法2(二分查找)

二分查找

但是前提必粗是有序

代码实现

只要left

求平均值

这个方式会更好

代码总结 

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>int main()
{int arr[] = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30 };int j = 0;scanf("%d", &j);int sz = sizeof(arr) / sizeof(arr[0]);//数组的总数,从1开始算int left = 0;//左下标int right = sz - 1;//减去1 才等于下标 这里是下标的意思//int mid = (left + right) / 2;//不能给外面是因为此时没有进入循环 mid的数值是确定的 不会随着循环发生改变while (left <= right){int mid = (left + right) / 2;if (arr[mid] < j)//这里也就是如果中间值大的话 那实际输入的就小,可以再次循环排查{left = mid + 1;//是因为中间值的不算进去的,然后既然已经 在else里面做排除所以加上会节约算法时间}else if (arr[mid] > j){right = mid - 1;}else if (arr[mid] == j){printf("找到了,下标是:%d\n", mid);break;}else{printf("傻子仔细看看,没有这个数组");break;}//printf("傻子仔细看看,没有这个数组");//break;}/*printf("傻子仔细看看,没有这个数组");*/return 0;
}

http://www.ppmy.cn/embedded/10112.html

相关文章

从零开始精通RTSP之深入理解RTCP协议

概述 RTCP&#xff0c;即实时控制协议&#xff0c;英文全称为RTP Control Protocol&#xff0c;是RTP的配套协议。与RTP不同&#xff0c;RTCP本身不传输实时数据&#xff0c;而是用于提供有关RTP会话的统计信息和控制功能。RTCP的主要目标是提供数据传输质量的反馈&#xff0c;…

加速大数据分析:Apache Kylin使用心得与最佳实践详解

Apache Kylin 是一个开源的分布式分析引擎&#xff0c;提供了Hadoop之上的SQL接口和多维分析&#xff08;OLAP&#xff09;能力以支持大规模数据。它擅长处理互联网级别的超大规模数据集&#xff0c;并能够进行亚秒级的查询响应时间。Kylin 的主要使用场景包括大数据分析、交互…

DDP、pytorch的分布式 torch.distributed.launch 训练说明

0、DDP的运行原理 执行步骤&#xff1a; 将data分为多个不同的batch&#xff0c;每个gpu得到batch都是不一样的然后将每个batch放在每个gpu上独立的执行最后得到的梯度求平均将平均梯度平分给每个gpu执行下一次迭代 这也就意味着你有多少个gpu&#xff0c;训练的速度也会提升…

level2行情+在线金融数据库

jvQuant&#xff1a;一站式金融量化服务平台 jvQuant作为一个领先的金融量化服务平台&#xff0c;为广大投资者和量化分析师提供了全面、高效、稳定的数据接入和量化分析服务。该平台涵盖了多个关键功能&#xff0c;包括交易接入、WebSocket行情接入、历史行情查询、在线数据库…

E-MapReduce极客挑战赛季军方案

前一段时间我参加了E-MapReduce极客挑战赛&#xff0c;很幸运的获得了季军。在这把我的比赛攻略给大家分享一下&#xff0c;希望可以抛砖引玉。 赛题分析与理解 赛题背景&#xff1a; 大数据时代&#xff0c;上云已成为越来越多终端客户大数据方案的落地选择&#xff0c;阿里…

milvus 相似度检索的底层原理

Milvus作为一款专为向量相似度检索设计的开源搜索引擎&#xff0c;其底层原理涉及高效的向量索引结构、并行计算优化、分布式架构设计等多个关键技术点。以下是对Milvus进行相似度检索时底层原理的简要概述&#xff1a; ### 1. **向量索引结构** #### **近似最近邻搜索 (Appr…

LSB隐写是什么?

LSB隐写是什么&#xff1f; 所需知识二进制位LSB的概念LSB在数值中的作用LSB在量化中的应用小结 LSB隐写原理应用威胁与挑战改进补充资料 所需知识 二进制数 位&#xff08;bit&#xff09; LSB概念 二进制 在计算机科学中&#xff0c;二进制数是一种数制&#xff0c;使用两…

ESP32与SD卡交互实现:文件读写实战与初始化详解及引脚定义

本代码实现ESP32与SD卡的交互&#xff0c;包括定义SPI引脚、创建自定义SPI类实例、编写WriteFile与ReadFile函数进行文件读写。setup函数初始化串口、SPI、SD卡&#xff0c;向“/test.txt”写入“myfirstmessage”&#xff0c;读取并打印其内容。loop函数留空待扩展。 1. 需要…