数据结构入门:时间复杂度与排序和查找 - 详解

news/2026/1/18 20:08:36/文章来源:https://www.cnblogs.com/ljbguanli/p/19499038

数据结构入门:时间复杂度与排序和查找 - 详解

一、时间复杂度

1.1定义

时间复杂度是算法执行次数(y)和数据总量(n)的关系,反映算法 “效率趋势”(不是具体执行时间)。

例:

y = a————>y=1————>O(1) 算法的执行次数与数据总量无关

y = an+b————>y=n————>O(n)

y = logan————>y=logn————>O(logn)

y = an²+bn+c————>y=n²————>O(n²)

效率排序:O(1)<O(logn)<O(n)<O(nlogn)<O(n2)

1.2真题练手

例题1:

int sum=0;
for(int i=1;i

分析

外层循环:i从 1 开始,每次 ×2,直到i≥n,执行次数是 log2​n(比如 n=8 时,i=1、2、4,共 3 次);

内层循环:每次执行i次(i=1 时执行 1 次,i=2 时执行 2 次,…,i=2^k 时执行 2^k 次);

总执行次数:1+2+4+…+2log2​n−1=2log2​n−1=n−1;

时间复杂度:O(n)。

例题2:

int i=0;
while(i*i <=n)i++;

分析

循环结束条件是i² >n,即i>√n,执行次数约为 ;

时间复杂度:O(√n

例题3:

count=0;
for(k=1;k<=n;k*=2)for(j=1;j<=n;j++)count++;

分析

外层循环:k从 1 开始,每次 ×2,直到k>n,执行次数是 log2​n(比如 n=8 时,k=1、2、4、8,共 4 次);

内层循环:每次固定执行n次;

总执行次数:log2​n×n=nlog2​n;

时间复杂度:O(nlogn)(对应选项 C)。

二、查找算法:从 “暴力” 到 “高效”

计算机 80% 的操作是 “查找”,两种常见方式对比:

2.1无序数组查找(暴力遍历)

比如数组[5,7,4,2,0,3,1,6]找 “4”:

只能从头到尾遍历,最坏情况执行 n 次;

时间复杂度:O(n)。

2.2折半查找(二分查找,仅适用于有序数组)

比如有序数组[0,1,2,3,4,5,6,7]找 “4”:

步骤:先查中间位mid=3(对应值 3),比 4 小,再查右半部分的中间位mid=5(对应值 5),比 4 大,最后查中间位 4(找到目标);

执行次数:log2​n(n=8 时执行 3 次);

时间复杂度:O(logn)。

三、排序算法:不同算法的效率差异

要想用折半查找,得先把数组排序 —— 看几个经典排序的逻辑和复杂度。

3.1冒泡排序(O(n2))

核心逻辑:前后元素对比,大的往后 “冒泡”。比如数组[4,2,0,3,1,5,6,7]

第 1 轮:对比 (4,2)→交换,(4,0)→交换,…,最大的 “7” 移到末尾;

第 2 轮:对比剩下的元素,第二大的 “6” 移到倒数第二位;

最坏情况执行次数:1+2+…+(n−1)=n(n−1)/2;

时间复杂度:O(n2)。

3.2简单选择排序(O(n2))

核心逻辑:每轮找最小值,和待排序部分的第一个元素交换。比如数组[0,1,2,3,5,4,7,6]

第 1 轮:找最小的 “0”,和第一个元素交换(已在正确位置);

第 2 轮:找剩下的最小 “1”,和第二个元素交换;

无论数组是否有序,都要遍历找最小值,执行次数约n2/2;

时间复杂度:O(n2)。

3.3新增:插入排序(O(n2))

核心逻辑:把数组分成 “已排序部分” 和 “未排序部分”,每次从未排序部分取第一个元素,插入到已排序部分的合适位置(类似打扑克时整理手牌)。

举个例子,数组[4,2,0,3,1,5,6,7]

第 1 轮:已排序部分是[4],取未排序的2,插入后变成[2,4]

第 2 轮:已排序部分是[2,4],取未排序的0,插入后变成[0,2,4]

第 3 轮:取未排序的3,插入到24之间,变成[0,2,3,4]

…… 直到所有元素插入完成。

最好情况:数组已经有序,每次插入只需要比较 1 次,总执行次数是n,时间复杂度O(n);

最坏情况:数组逆序,第i个元素需要比较i次(比如第 2 个元素比较 2 次,第 3 个比较 3 次…),总执行次数是1+2+…+(n−1)=n(n−1)/2,时间复杂度O(n2);

平均情况:时间复杂度也是O(n2)。

3.4 希尔排序(介于O(nlogn)和O(n2))

核心逻辑:按 “间隔” 分组排序,逐步缩小间隔,最后用直接插入排序收尾。比如数组[5,7,4,2,0,3,1,6](长度 8):

第 1 轮:间隔 = 4,分成 4 组(5,0)(7,3)(4,1)(2,6),组内排序后得到[0,3,1,2,5,7,4,6]

第 2 轮:间隔 = 2,分成 2 组(0,1,5,4)(3,2,7,6),组内排序后得到[0,2,1,3,4,6,5,7]

第 3 轮:间隔 = 1,直接插入排序得到有序数组;

时间复杂度:和间隔选择有关,通常介于O(nlogn)和O(n2)之间。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1179272.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32单片机16*16汉字点阵广告牌75(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码

STM32单片机16*16汉字点阵广告牌75(设计源文件万字报告讲解)&#xff08;支持资料、图片参考_相关定制&#xff09;_文章底部可以扫码 产品功能描述&#xff1a; 本系统由STM32F103C8T6单片机核心板、16*16点阵屏显示模块、按键及电源组成。 1、通过按键可以切换点阵屏显示内容…

Meta 收购 Manus:AI 智能体由对话转向执行的转折点

在 2025 年的最后一天&#xff0c;Meta 公司通过官方渠道确认了对 AI 初创企业 Manus 的收购计划。根据相关分析机构披露的数据&#xff0c;这笔交易涉及金额预计超过 20 亿美元。这一变动不仅是 Meta 在人工智能领域扩张的延续&#xff0c;也反映出全球科技巨头正在将研发重点…

Python+django的旅游景点交通酒店预订网的设计与实现

目录设计背景与目标系统功能模块技术实现方案系统特色与创新应用价值与总结开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;设计背景与目标 随着旅游业的快速发展&#xff0c;游客对便捷的景…

【时频分析】基于matlab面向相交群延迟多分量信号的时频重分配同步挤压频域线性调频小波变换【含Matlab源码 14985期】复现含文献

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到海神之光博客之家&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49…

如何通过数据分析实现精准产品定位

如何通过数据分析实现精准产品定位 关键词:数据分析、精准产品定位、市场细分、用户画像、数据挖掘 摘要:本文旨在探讨如何利用数据分析来实现精准的产品定位。通过对市场数据、用户数据等多源数据的深入分析,我们可以更好地了解市场需求、用户偏好和竞争态势,从而为产品找…

day141—递归—二叉树的最大深度(LeetCode-104)

题目描述给定一个二叉树 root &#xff0c;返回其最大深度。二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。示例 1&#xff1a;输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;3示例 2&#xff1a;输入&#xff1a;root [1,null,2] 输…

STM32-270-多功能水质监测系统(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码

STM32-270-多功能水质监测系统(设计源文件万字报告讲解)&#xff08;支持资料、图片参考_相关定制&#xff09;_文章底部可以扫码 产品功能描述&#xff1a; 本系统由STM32F103C8T6单片机核心板、TFT1.44寸彩屏液晶显示电路、&#xff08;无线蓝牙/无线WIFI/无线视频监控模块-可…

基于图像模糊度统计和盲卷积滤波的图像去模糊算法matlab仿真

1.前言 基于图像模糊度统计和盲卷积滤波的图像去模糊算法,结合了对图像模糊程度的量化评估和无需预先知道模糊核的图像恢复技术,能够在一定程度上自动分析图像的模糊特性并进行有效复原。 2.算法运行效果图预览 (完整…

Python+django的同城社区篮球队管理系统 体育运动篮球赛事预约系统

目录同城社区篮球队管理系统摘要开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;同城社区篮球队管理系统摘要 该系统基于PythonDjango框架开发&#xff0c;旨在为社区篮球爱好者提供便捷的球…

Python+django的图书资料借阅信息管理系统的设计与实现

目录摘要开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;摘要 随着信息化时代的快速发展&#xff0c;图书资料的管理效率成为图书馆和各类机构关注的重点。传统的纸质记录方式效率低下且容易…

HTML打包EXE工具2.2.0版本重磅更新 - 2026年最新版本稳定性大幅提升

HTML打包EXE工具迎来2026年首个重要版本更新!2.2.0版本专注于稳定性提升和用户体验优化,修复了多个影响使用的关键问题,新增清理本地激活数据功能,为开发者提供更可靠的HTML转EXE解决方案。 软件官网 HTML打包EXE工…

STM32-S273-对讲机频道可设+语音通话+一对多+状态显示+铃音提醒+按键设置+OLED屏+声光提醒(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码

STM32-S273-对讲机频道可设语音通话一对多状态显示铃音提醒按键设置OLED屏声光提醒 STM32-S273N(硬件操作详细): 产品功能描述&#xff1a; 本系统由STM32F103C8T6单片机核心板、OLED屏、&#xff08;无线蓝牙/无线WIFI/无线视频监控/联网云平台模块-可选&#xff09;、对讲机模…

STM32智能家居光照温度可燃气检测系统32-907(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码

STM32智能家居光照温度可燃气检测系统32-907(设计源文件万字报告讲解)&#xff08;支持资料、图片参考_相关定制&#xff09;_文章底部可以扫码 产品功能描述&#xff1a; 本系统由STM32F103C8T6单片机核心板、TFT彩屏(1.44寸屏按键/3.5寸触摸屏/7.0寸触摸屏)、无线选择&#x…

基于深度学习的PCB板元器件检测系统演示与介绍(YOLOv12/v11/v8/v5模型+Pyqt5界面+训练代码+数据集)

本文介绍了一个基于YOLO算法的PCB板元器件检测系统,该系统可识别22种元器件,支持图片、视频、批量文件和摄像头实时检测。系统采用Python3.10开发,前端使用PyQt5,数据库为SQLite,集成了YOLOv5/v8/v11/v12等多种模…

51单片机心率计脉搏测量仪表体温检测73(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)_文章底部可以扫码

51单片机心率计脉搏测量仪表体温检测73(设计源文件万字报告讲解)&#xff08;支持资料、图片参考_相关定制&#xff09;_文章底部可以扫码51单片机心率计脉搏测量仪表体温检测73(设计源文件万字报告讲解)&#xff08;支持资料、图片参考_相关定制&#xff09;_文章底部可以扫码…

Python+django的数字化高校宿舍报修出入登记调换宿舍管理系统的实现

目录数字化高校宿舍管理系统实现摘要开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;数字化高校宿舍管理系统实现摘要 该系统基于PythonDjango框架开发&#xff0c;旨在解决传统高校宿舍管理…

【数字信号调制】基于matlab AWGN信道BPSK和QPSK仿真(含BER分析)【含Matlab源码 14987期】含报告

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到海神之光博客之家&#x1f49e;&#x1f49e;&#x1f49e;&#x1f49…

未命名鲜花

近期心情不好,阅读了大量多头鲜花以及多头在鲜花中推荐阅读的文章(一篇谈一部乒乓球的番带来的启示的文章,以及一些知乎上 Anlin 写的日寄),有很多的感触与自己的思考,因此也来尝试自己写一点。 感觉鲜花写什么确…

竞业协议

竞业协议 可以查看这个文章 https://www.zhihu.com/question/526853422 核心思想: 竞业补偿不是“补贴”,而是企业为限制员工竞争行为所支付的对价。 企业当然可以选择不再支付,但一旦停止支付,竞业限制的基础即随…

芯谷科技—D9420A:高性能同步降压稳压器,助力高效电源设计 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …