C语言使用qsort和bsearch实现二分查找
引言
在计算机科学领域,查找是一项基本操作,而二分查找是一种高效的查找算法。本博客将详细解释一个简单的C语言程序,演示如何使用标准库函数qsort和bsearch来对一个整数数组进行排序和二分查找。
代码解析
包含头文件
#include <stdio.h>
#include <stdlib.h>
首先,我们包含了两个标准头文件,stdio.h用于输入输出操作,stdlib.h用于内存分配和其他一些杂项功能。
比较函数
int compareIntegers(const void *a, const void *b) {return (*(int *)a - *(int *)b);
}
定义了一个比较函数compareIntegers,该函数用于在排序和二分查找时比较两个整数。这个函数的作用是返回a - b的值,即升序排序。
主函数
int main() {// 创建已排序的整数数组int numbers[] = {101, 305, 248, 407, 109};int numNumbers = sizeof(numbers) / sizeof(numbers[0]);// 排序数组qsort(numbers, numNumbers, sizeof(numbers[0]), compareIntegers);// 设置要查找的 numberint targetNumber = 305;// 使用bsearch搜索学生int *result = (int *)bsearch(&targetNumber, numbers, numNumbers, sizeof(numbers[0]), compareIntegers);// 检查结果并输出if (result != NULL) {printf("Number found: %d\n", *result);} else {printf("Number %d not found\n", targetNumber);}return 0;
}
创建并排序数组
int numbers[] = {101, 305, 248, 407, 109};
int numNumbers = sizeof(numbers) / sizeof(numbers[0]);
qsort(numbers, numNumbers, sizeof(numbers[0]), compareIntegers);
在主函数中,我们首先创建了一个整数数组numbers,然后使用sizeof操作符计算数组元素个数。接下来,我们使用qsort函数对数组进行升序排序,传递了比较函数compareIntegers来定义排序顺序。
二分查找
int targetNumber = 305;
int *result = (int *)bsearch(&targetNumber, numbers, numNumbers, sizeof(numbers[0]), compareIntegers);
设置要查找的目标数字为305,然后使用bsearch函数在已排序的数组中进行二分查找。同样,我们传递了比较函数compareIntegers来确保查找的一致性。
输出结果
if (result != NULL) {printf("Number found: %d\n", *result);
} else {printf("Number %d not found\n", targetNumber);
}
最后,我们检查bsearch的结果。如果找到了目标数字,就输出找到的数字;否则,输出未找到的消息。
时间复杂度
让我们分析一下这个程序中排序和查找部分的时间复杂度:
-
排序 (
qsort):- 时间复杂度:O(n * log(n))
qsort通常使用快速排序算法,其平均时间复杂度为O(n * log(n)),其中n是数组的元素个数。- 在这个程序中,
numNumbers是5,所以排序的时间复杂度为O(5 * log(5))。
- 时间复杂度:O(n * log(n))
-
查找 (
bsearch):- 时间复杂度:O(log(n))
bsearch使用二分查找算法,其时间复杂度为O(log(n)),其中n是数组的元素个数。- 在这个程序中,数组已经排好序,
numNumbers是5,所以查找的时间复杂度为O(log(5))。
- 时间复杂度:O(log(n))
因此,整个程序的时间复杂度主要由排序的部分决定,为O(5 * log(5))。在大O表示法中,忽略常数项,这可以简化为O(log(5)),即O(1)。因此,总体时间复杂度可以近似看作是O(1),即常数时间。这意味着程序的运行时间与数组的规模无关,对于小规模的数组来说是非常高效的。
总结
这个简单的C程序演示了如何使用qsort对数组进行排序,然后使用bsearch进行二分查找。这两个函数是C标准库中用于排序和查找的强大工具,通过传递比较函数,我们可以适应不同的数据类型和排序/查找需求。在实际编程中,这种方法能够提高效率,并且是一种常见的编程实践。
相关文章:
C语言使用qsort和bsearch实现二分查找
引言 在计算机科学领域,查找是一项基本操作,而二分查找是一种高效的查找算法。本博客将详细解释一个简单的C语言程序,演示如何使用标准库函数qsort和bsearch来对一个整数数组进行排序和二分查找。 代码解析 包含头文件 #include <stdi…...
MySQL的替换函数及补全函数的使用
前提: mysql的版本是8.0以下的。不支持树形结构递归查询的。但是,又想实现树形结构的一种思路 提示:如果使用的是MySQL8.0及其以上的,想要实现树形结构,请参考:MySQL数据库中,如何实现递归查询…...
2022第十二届PostgreSQL中国技术大会-核心PPT资料下载
一、峰会简介 本次大会以“突破•进化•共赢 —— 安全可靠,共建与机遇”为主题,助力中国数据库基础软件可掌控、可研究、可发展、可生产,并推动数据库生态的繁荣与发展。大会为数据库从业者、数据库相关企业、数据库行业及整个IT产业带来崭…...
2024 年 10大 AI 趋势
2025 年,全球人工智能市场预计将达到惊人的 1906.1 亿美元,年复合增长率高达 36.62%。 人工智能软件正在迅速改变我们的世界,而且这种趋势在未来几年只会加速。 我们分析了未来有望彻底改变 2024 年的 10 个AI趋势。从生成式人工智能的兴起到…...
Uboot
什么是Bootloader? Linux系统要启动就必须需要一个 bootloader程序,也就说芯片上电以后先运行一段bootloader程序。 这段 **bootloader程序会先初始化时钟,看门狗,中断,SDRAM,等外设,然后将 Linux内核从f…...
ECMAScript 的未来:预测 JavaScript 创新的下一个浪潮
以下是简单概括关于JavaScript知识点以及一些目前比较流行的比如:es6 想要系统学习: 大家有关于JavaScript知识点不知道可以去 🎉博客主页:阿猫的故乡 🎉系列专栏:JavaScript专题栏 🎉ajax专栏&…...
代码随想录算法训练营第十三天 | 239. 滑动窗口最大值、347.前 K 个高频元素
239. 滑动窗口最大值 题目链接:239. 滑动窗口最大值 给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 文章讲解…...
推荐五个免费的网络安全工具
导读: 在一个完美的世界里,信息安全从业人员有无限的安全预算去做排除故障和修复安全漏洞的工作。但是,正如你将要学到的那样,你不需要无限的预算取得到高质量的产品。这里有SearchSecurity.com网站专家Michael Cobb推荐的五个免费…...
Cross-Drone Transformer Network for Robust Single Object Tracking论文阅读笔记
Cross-Drone Transformer Network for Robust Single Object Tracking论文阅读笔记 Abstract 无人机在各种应用中得到了广泛使用,例如航拍和军事安全,这得益于它们与固定摄像机相比的高机动性和广阔视野。多无人机追踪系统可以通过从不同视角收集互补的…...
【LeetCode刷题笔记】动态规划(二)
647. 回文子串 解题思路: 1. 暴力穷举 , i 遍历 [0, N) , j 遍历 [i+1, N] ,判断每一个子串 s[i, j) 是否是回文串,判断是否是回文串可以采用 对撞指针 的方法。如果是回文串就计数 +1...
(十七)Flask之大型项目目录结构示例【二扣蓝图】
大型项目目录结构: 问题引入: 在上篇文章讲蓝图的时候我给了一个demo项目,其中templates和static都各自只有一个,这就意味着所有app的模板和静态文件都放在了一起,如果项目比较大的话,这就非常乱…...
蓝牙技术在物联网中的应用
随着蓝牙技术的不断演进和发展,蓝牙已经从单一的传统蓝牙技术发展成集传统蓝牙。高速蓝牙和低耗能蓝牙于一体的综合技术,不同的应用标准更是超过40个越来越广的技术领域和越来越多的应用场景,使得目前的蓝牙技术成为包含传感器技术、识别技术…...
宝塔面板Linux服务器CentOS 7数据库mysql5.6升级至5.7版本教程
近段时间很多会员问系统更新较慢,也打算上几个好的系统,但几个系统系统只支持MYSQL5.7版本,服务器一直使用较低的MYSQL5.6版本,为了测试几个最新的系统打算让5.6和5.7并存使用,参考了多个文档感觉这种并存问题会很多。…...
掌握常用Docker命令,轻松管理容器化应用
Docker是一个开源的应用容器引擎,它可以让开发者将应用程序及其依赖打包到一个轻量级、可移植的容器中,然后发布到任何流行的Linux机器或Windows机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。下面介…...
【数据结构1-2】P5076 普通二叉树(简化版)(c++,multiset做法)
文章目录 一、题目【深基16.例7】普通二叉树(简化版)题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1基本思路: 一、题目 【深基16.例7】普通二叉树(简化版) 题目描述 您需要写一种数据结构,来维…...
Linux系统安装及管理
目录 一、Linux应用程序基础 1.1应用程序与系统命令的关系 1.2典型应用程序的目录结构 1.3常见的软件包装类型 二、RPM软件包管理 1.RPM是什么? 2.RPM命令的格式 2,1查看已安装的软件包格式 2.2查看未安装的软件包 3.RPM安装包从哪里来? 4.挂…...
MySQL学生向笔记以及使用过程问题记录(内含8.0.34安装教程
MySQL 只会写代码 基本码农 要学好数据库,操作系统,数据结构与算法 不错的程序员 离散数学、数字电路、体系结构、编译原理。实战经验, 高级程序员 去IOE:去掉IBM的小型机、Oracle数据库、EMC存储设备,代之以自己在开源…...
obs video-io.c
video_frame_init 讲解 /* messy code alarm video_frame_init 函数用于初始化视频帧。它接受一个指向 struct video_frame 结构体的指针 frame, 视频格式 format,以及宽度 width 和高度 height。该函数根据视频格式的不同,计算出每个视频帧…...
简述 tcp 和 udp的区别?
简述 tcp 和 udp的区别? TCP(Transmission Control Protocol)和UDP(User Datagram Protocol)是两种不同的传输层协议,用于在计算机网络中进行数据传输。以下是它们的主要区别: 区别࿱…...
信息收集 - 谷歌hack
搜索引擎 FOFA网络空间测绘:https://fofa.info/ FOFA(FOcus on Assets)是一个网络空间搜索引擎,可以帮助用户快速定位和收集特定目标的信息。 ZoomEye:https://www.zoomeye.org ZoomEye 是一个网络空间搜索引擎,可以用于发现和收集特定目标的网络设备、Web应用程序、开放…...
【深度解析】DeepSeek API 悄然分叉:开发者该如何正确评估与接入最新大模型?
摘要 本文基于近期 DeepSeek API 更新及官方文档变更,从「API 版本 ≠ Web/App 版本」这一关键细节出发,梳理大模型多版本部署策略背后的技术与成本逻辑,并给出基于兼容 OpenAI 协议的实战接入示例(使用 claude‑sonnet‑4‑6&…...
基于微信小程序实现马拉松报名系统【附项目源码+论文说明】
基于java和微信小程序实现马拉松报名系统演示【内附项目源码LW说明】摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了马拉松报名系统微信小程序的开发全过程。通过分析马拉松报名系统微信小程序管理的不足&…...
别再只用Cesium自带的InfoBox了!3个高级自定义弹窗交互方案对比
Cesium信息展示进阶指南:三种自定义弹窗方案深度评测 当你在Cesium项目中需要展示复杂信息时,原生InfoBox往往显得力不从心。它就像一把瑞士军刀——虽然通用,但在专业场景下总感觉差点意思。本文将带你突破默认组件的限制,探索三…...
Ncorr 2D:开源数字图像相关技术的架构解析与工程实现
Ncorr 2D:开源数字图像相关技术的架构解析与工程实现 【免费下载链接】ncorr_2D_matlab 2D Digital Image Correlation Matlab Software 项目地址: https://gitcode.com/gh_mirrors/nc/ncorr_2D_matlab 在材料力学、生物医学和结构工程领域,精确测…...
MMC级联H桥仿真图解析:电压电流双闭环控制策略研究
MMC,级联H桥仿真图,电压电流双闭环。最近在搞MMC(模块化多电平换流器)的仿真,发现这玩意儿真是电力电子界的乐高——全靠子模块堆叠。特别是级联H桥的结构,玩电压合成比搭积木刺激多了。今天咱们就着电压电…...
新手零门槛入门:用快马生成你的第一个jiyutrainer式Python练习脚本
作为一个刚接触Python的新手,想要练习编程却常常被各种环境配置和工具安装搞得晕头转向。最近我发现了一个特别适合新手入门的方法——使用InsCode(快马)平台来生成自己的第一个Python练习脚本。下面我就来分享一下这个零门槛的入门体验。 为什么选择jiyutrainer式练…...
热门 PyPI 包 LiteLLM 遭投毒,窃取凭据和认证令牌
聚焦源代码安全,网罗国内外最新资讯! 编译:代码卫士专栏供应链安全数字化时代,软件无处不在。软件如同社会中的“虚拟人”,已经成为支撑社会正常运转的最基本元素之一,软件的安全性问题也正在成为当今社会的…...
2026整家定制一线品牌选购报告:基于物理指标与国标数据的多维交叉验证
针对用户关于“2026年整家定制一线品牌推荐”及“质量好的定制品牌有哪些”的咨询,评估的核心不应仅停留在品牌知名度,而在于能否在结构力学稳定性、材料理化抗性、数字化设计精度及长效履约信用四个维度完成证据链闭环。本文通过检索 金牌家居ÿ…...
探索Java字节码的秘密:专业级反编译工具实战指南
探索Java字节码的秘密:专业级反编译工具实战指南 【免费下载链接】jd-gui A standalone Java Decompiler GUI 项目地址: https://gitcode.com/gh_mirrors/jd/jd-gui Java反编译工具是中级开发者提升代码分析效率的关键利器,它能够将编译后的字节码…...
用Artisan构建专业级咖啡烘焙解决方案:从数据采集到品质优化的全流程指南
用Artisan构建专业级咖啡烘焙解决方案:从数据采集到品质优化的全流程指南 【免费下载链接】artisan artisan: visual scope for coffee roasters 项目地址: https://gitcode.com/gh_mirrors/ar/artisan 在咖啡产业数字化转型的浪潮中,专业烘焙师正…...
