排序算法归类整理对比
以下是常见排序算法的详细分类和解析,涵盖原理、时间复杂度及适用场景:
一、比较排序算法
1. 快速排序(Quick Sort)
- 原理:分治策略,选取基准元素(pivot),将数组分为小于基准和大于基准的两部分,递归排序。
- 时间复杂度:
- 平均:(O(n \log n))
- 最坏(已排序数组):(O(n^2))
- 空间复杂度:(O(\log n))(递归栈)
- 稳定性:不稳定
- 代码示例:
def quick_sort(arr):if len(arr) <= 1:return arrpivot = arr[len(arr) // 2]left = [x for x in arr if x < pivot]middle = [x for x in arr if x == pivot]right = [x for x in arr if x > pivot]return quick_sort(left) + middle + quick_sort(right)
2. 归并排序(Merge Sort)
- 原理:分治法,将数组递归拆分到最小单元,再合并有序子数组。
- 时间复杂度:始终 (O(n \log n))
- 空间复杂度:(O(n))(合并时需要临时数组)
- 稳定性:稳定
- 适用场景:大数据量、链表排序、外部排序(如磁盘文件排序)。
3. 堆排序(Heap Sort)
- 原理:构建最大堆,将堆顶元素(最大值)与末尾元素交换,调整堆结构。
- 时间复杂度:(O(n \log n))
- 空间复杂度:(O(1))(原地排序)
- 稳定性:不稳定
- 优势:适合实时数据流(无需全部数据即可开始排序)。
二、简单排序算法
1. 插入排序(Insertion Sort)
- 原理:逐个将元素插入已排序序列的合适位置。
- 时间复杂度:
- 平均:(O(n^2))
- 最优(已排序数组):(O(n))
- 空间复杂度:(O(1))
- 稳定性:稳定
- 适用场景:小规模数据或基本有序数据。
2. 选择排序(Selection Sort)
- 原理:每轮找到最小元素,与当前位置交换。
- 时间复杂度:始终 (O(n^2))
- 空间复杂度:(O(1))
- 稳定性:不稳定(交换可能破坏顺序)。
3. 冒泡排序(Bubble Sort)
- 原理:相邻元素比较交换,逐步将最大值“冒泡”到末尾。
- 时间复杂度:
- 平均:(O(n^2))
- 最优(已排序数组):(O(n))
- 空间复杂度:(O(1))
- 稳定性:稳定
三、非比较排序算法
1. 计数排序(Counting Sort)
- 原理:统计元素出现次数,按计数重建有序数组。
- 时间复杂度:(O(n + k))((k) 为数据范围)
- 空间复杂度:(O(k))
- 适用场景:整数排序,且数据范围 (k) 较小。
2. 桶排序(Bucket Sort)
- 原理:将数据分到有限数量的桶中,每个桶单独排序后合并。
- 时间复杂度:
- 平均:(O(n + k))((k) 为桶数量)
- 最坏:(O(n^2))
- 适用场景:数据均匀分布的场景。
3. 基数排序(Radix Sort)
- 原理:按位数从低位到高位依次进行稳定排序(如计数排序)。
- 时间复杂度:(O(d(n + k)))((d) 为最大位数,(k) 为基数范围)
- 适用场景:整数或字符串排序。
四、算法对比与选择
| 算法 | 平均时间复杂度 | 空间复杂度 | 稳定性 | 适用场景 |
|---|---|---|---|---|
| 快速排序 | (O(n \log n)) | (O(\log n)) | 不稳定 | 通用排序,大数据量 |
| 归并排序 | (O(n \log n)) | (O(n)) | 稳定 | 外部排序、稳定性要求高 |
| 堆排序 | (O(n \log n)) | (O(1)) | 不稳定 | 原地排序、实时数据流 |
| 插入排序 | (O(n^2)) | (O(1)) | 稳定 | 小规模或基本有序数据 |
| 计数排序 | (O(n + k)) | (O(k)) | 稳定 | 整数且范围小 |
| 基数排序 | (O(d(n + k))) | (O(n + k)) | 稳定 | 多位数整数或定长字符串 |
相关文章:
排序算法归类整理对比
以下是常见排序算法的详细分类和解析,涵盖原理、时间复杂度及适用场景: 一、比较排序算法 1. 快速排序(Quick Sort) 原理:分治策略,选取基准元素(pivot),将数组分为小于…...
前端项目部署阻止用户打开控制台
需求:在前端开发过程中,会遇到生产坏境不让用户打开控制台,防止不法分子虚假信息操作。 废话不多说一共两步,添加我们的js方法,和在全局使用这个方法。 第一步:添加我的js文件: //禁用开发者…...
一周学会Flask3 Python Web开发-Jinja2模板过滤器使用
锋哥原创的Flask3 Python Web开发 Flask3视频教程: 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 在Jinja2中,过滤器(filter)是一些可以用来修改和过滤变量值的特殊函数,过滤器和变量用一个竖线 | &a…...
【STM32H743IIT6】STM32H7的ADC时钟频率设置问题 —— 网上大多文章未注意到的要点!
前言 我使用的是定时器触发ADC采样。最近在想达到ADC的最高采样率的时候,发现一直却卡在1Msps上不去,直到在硬汉嵌入式的论坛里才发现了答案:[ADC] STM32H743/H750的Y版和V版芯片ADC的主频区别 这篇文章就详细的讲一下这个问题,这…...
JavaScript基础(函数及面向对象)
函数 定义函数 Java定义方法: public 返回值类型 方法名(){ return 返回值 } 定义函数方法一 eg:定义一个绝对值函数 function abs(x) {if (x>0){return x;}else {return -x;}} 调用函数: 注意:一旦执行到return代表函数…...
2025面试Go真题第一场
前几天参加了一场面试,GoLang 后端工程师,他们直接给了我 10 道题,我留了一个截图。 在看答案之前,你可以先简单做一下,下面我会对每个题目做一个说明。 文章目录 1、golang map 是否并发安全?2、协程泄漏的原因可能是…...
dockerfile基于alpine构建haproxy
1. 结构目录 [rootlocalhost ~]# tree haproxy/ haproxy/ ├── dockerfile └── files├── env.txt├── haproxy-2.5.0.tar.gz├── haproxycfg.sh├── install.sh└── sysctl.conf1 directory, 6 files [rootlocalhost ~]# 2. 编写dockerfile [rootlocalhost ~…...
【有奖实践】轻量消息队列(原 MNS)订阅 OSS 事件实时处理文件变动
当你需要对对象存储 OSS(Object Storage Service)中的文件变动进行实时处理、同步、监听、业务触发、日志记录等操作时, 你可以通过设置 OSS 的事件通知规则,自定义关注的文件,并将 OSS 事件推送到轻量消息队列&#x…...
关于Postman自动获取token
在使用postman测试联调接口时,可能每个接口都需要使用此接口生成的令牌做Authorization的Bearer Token验证,最直接的办法可能会是一步一步的点击,如下图: 在Authorization中去选择Bearer Token,然后将获取到的token粘贴…...
Baklib知识中台构建企业智慧中枢
智能技术架构构建路径 Baklib知识中台的技术架构设计以模块化和可扩展性为核心,通过分层解耦的架构体系实现知识管理的全流程覆盖。底层依托智能语义分析引擎与多模态知识图谱,完成非结构化数据的自动清洗与语义关联;中间层构建统一的知识资…...
解决安卓recyclerView滚到底部不彻底问题
问题分析: 传统recycleview滚到到底部方式scrollToPosition(lastpositon),只能定位到最后一条数据的顶部。由于数据过长,无法滚动到最底部。 问了下deepseek,给了个方案: private void recyclerViewScrollToBottom()…...
python unzip file
要在 Python 中解压文件并显示进度,我们需要在解压过程中跟踪文件的提取进度。由于 zipfile 模块本身不直接支持进度显示,我们可以通过手动计算并使用 tqdm 库来显示进度条。 安装 tqdm 首先,确保你已经安装了 tqdm 库,用于显示…...
Elasticsearch索引设计与分片策略深度优化-手记
一、索引设计的黄金法则(从踩坑到精通的必经之路) 1. 字段类型显式声明原则 动态映射是新手最易踩的坑,某金融平台曾因金额字段被自动识别为text类型,导致聚合查询时触发OOM。正确做法应显式声明核心字段: PUT /fin…...
StepAudio:语音大模型
Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤),方言ÿ…...
监听其他音频播放时暂停正在播放的音频
要实现当有其他音频播放时暂停当前音频,你可以使用全局事件总线或 Vuex 来管理音频播放状态。这里我将展示如何使用一个简单的事件总线来实现这个功能。 首先,你需要创建一个事件总线。你可以在项目的一个公共文件中创建它,例如 eventBus.js…...
Kafka可视化工具EFAK(Kafka-eagle)安装部署
Kafka Eagle是什么? Kafka Eagle是一款用于监控和管理Apache Kafka的开源系统,它提供了完善的管理页面,例如Broker详情、性能指标趋势、Topic集合、消费者信息等。 源代码地址:https://github.com/smartloli/kafka-eagle 前置条件…...
[Web 安全] PHP 反序列化漏洞 —— PHP 反序列化漏洞演示案例
关注这个专栏的其他相关笔记:[Web 安全] 反序列化漏洞 - 学习笔记-CSDN博客 PHP 反序列化漏洞产生原因 PHP 反序列化漏洞产生的原因就是因为在反序列化过程中,unserialize() 接收的值可控。 0x01:环境搭建 这里笔者是使用 PhpStudy 搭建的环…...
2.部署kafka:9092
官方文档:http://kafka.apache.org/documentation.html (虽然kafka中集成了zookeeper,但还是建议使用独立的zk集群) Kafka3台集群搭建环境: 操作系统: centos7 防火墙:全关 3台zookeeper集群内的机器,1台logstash 软件版本: …...
springboot博客系统详解与实现(后端实现)
目录 前言: 项目介绍 一、项目的准备工作 1.1 数据准备 1.2 项目创建 1.3 前端页面的准备 1.4 配置配置文件 二、公共模块 2.1 根据需求完成公共层代码的编写 2.1.1 定义业务状态枚举 2.1.2 统一返回结果 2.1.3 定义项目异常 2.1.4 统一异常处理 三、业…...
14.12 Auto-GPT OutputParser 架构设计:构建安全可控的大模型输出管道
Auto-GPT OutputParser 架构设计:构建安全可控的大模型输出管道 关键词:Auto-GPT 输出解析、结构化响应控制、内容安全过滤、多格式输出适配、错误恢复机制 1. OutputParser 的核心作用与设计挑战 输出解析的三大核心任务: #mermaid-svg-sUqVk51rX50EHefe {font-family:&q…...
seacmsv9注入管理员账号密码+orderby+limit
一、网上收集: 海洋影视管理系统(seacms,海洋cms)是一套专为不同需求的站长而设计的视频点播系统,采 用的是 php5.Xmysql 的架构,seacmsv9漏洞文件:./comment/api/index.php,漏洞参数…...
企业级大模型应用的Java-Python异构融合架构实践
一、后端语言相关技术生态 Python语言 Python在AI计算领域拥有全面的生态支持: 底层工具库: Pandas、NumPy、SciPy、Matplotlib深度学习框架: PyTorch、TensorFlow领域专用框架: HuggingFace Transformers(社区生态为主) 常见Python框架 …...
C#连接sql server
连接时,出现如下提示: ERROR [IM014] [Microsoft][ODBC 驱动程序管理器] 在指定的 DSN 中,驱动程序和应用程序之间的体系结构不匹配 原因是odbc的驱动和应用程序的架构不一致。我的odbc如下所示: 显示为64位,而c#程序显…...
粉色和紫色渐变壁纸怎么设计?
粉色和紫色的渐变壁纸设计可以打造极为浪漫的氛围,这两种颜色的搭配极具梦幻感与浪漫气息,常被用于各种浪漫主题的设计之中。以下是关于粉色和紫色渐变壁纸的设计方法: 一、渐变方向设计 横向渐变:从画面左侧的粉色过渡到右侧的紫…...
计算机网络:从底层原理到前沿应用,解锁数字世界的连接密码
计算机网络:从底层原理到前沿应用,解锁数字世界的连接密码 在信息如洪流般奔涌的时代,计算机网络宛如无形的脉络,贯穿于我们生活的每一个角落。它不仅是数据传输的通道,更是连接全球、驱动创新的核心力量。从日常的网络…...
AOP基础-01.快速入门
一.AOP 对于统计每一个业务方法的耗时这一操作,如果再业务层的每一个方法前获取方法运行的开始时间,方法结束获取结束时间,然后计算执行耗时,那这样就太繁琐了。能不能定义一个模板方法,使得该方法能够在业务层的方法执…...
Linux主机用户登陆安全配置
Linux主机用户登陆安全配置 在Linux主机上进行用户登录安全配置是一个重要的安全措施,可以防止未经授权的访问。以下是如何创建用户hbu、赋予其sudo权限,以及禁止root用户SSH登录,以及通过ssh key管理主机用户登陆。 创建用户hbu 使用具有…...
Solidity 开发环境
Solidity 开发环境 Solidity编辑器:Solidity编辑器是⼀种专⻔⽤于编写和编辑Solidity代码的编辑器。常⽤的Solidity编辑器包括 Visual Studio Code、Atom和Sublime Text。以太坊开发环境:以太坊开发环境(Ethereum Development Environment&a…...
图像处理、数据挖掘、数据呈现
目录 图像处理方法 阈值分割 图像处理方法 图像平滑 图像锐化 图像增强 阈值分割 边缘检测 阈值分割 特征提取 提取边界 区域提取 主成分压缩 POI 多源数据 数据挖掘 多源数据提取 关联度提取 位置集群, 新闻事件, 权限 个人喜好 历史…...
Go小技巧易错点100例(二十三)
本期分享: 1.Go Module控制Go版本 2.int转string注意事项 3.Go项目查看mod依赖关系 Go Module控制Go版本 当我们开发Go项目涉及到两台及以上的机器,而且它们又刚好是不同操作系统的时候,可能就要把代码挪到另一台机器上重新编译ÿ…...
