常见排序算法详解及其复杂度分析
常见排序算法详解及其复杂度分析
排序算法是数据结构与算法学习中的基础内容,也是面试高频考点。本文将系统介绍几种常见的排序算法,包括它们的原理、时间复杂度、空间复杂度以及 Python 实现方法。
一、冒泡排序(Bubble Sort)
原理
通过多次遍历待排序序列,每次比较相邻元素并交换顺序错误的元素,每一轮都将最大(或最小)元素“冒泡”到序列末尾。
实现
def bubble_sort(arr):n = len(arr)for i in range(n):for j in range(0, n-i-1):if arr[j] > arr[j+1]:arr[j], arr[j+1] = arr[j+1], arr[j]
复杂度
- 时间复杂度:O(n²)
- 空间复杂度:O(1)
- 稳定性:稳定
二、选择排序(Selection Sort)
原理
每次从未排序部分选择最小(或最大)元素,放到已排序部分的末尾。
实现
def selection_sort(arr):n = len(arr)for i in range(n):min_idx = ifor j in range(i+1, n):if arr[j] < arr[min_idx]:min_idx = jarr[i], arr[min_idx] = arr[min_idx], arr[i]
复杂度
- 时间复杂度:O(n²)
- 空间复杂度:O(1)
- 稳定性:不稳定
三、插入排序(Insertion Sort)
原理
将未排序元素插入到已排序序列的合适位置。
实现
def insertion_sort(arr):n = len(arr)for i in range(1, n):key = arr[i]j = i - 1while j >= 0 and arr[j] > key:arr[j+1] = arr[j]j -= 1arr[j+1] = key
复杂度
- 时间复杂度:O(n²)
- 空间复杂度:O(1)
- 稳定性:稳定
四、归并排序(Merge Sort)
原理
采用分治思想,将序列递归分成两半,分别排序后合并。
实现
def merge_sort(arr):if len(arr) <= 1:return arrmid = len(arr) // 2left = merge_sort(arr[:mid])right = merge_sort(arr[mid:])return merge(left, right)def merge(left, right):result = []i = j = 0while i < len(left) and j < len(right):if left[i] <= right[j]:result.append(left[i])i += 1else:result.append(right[j])j += 1result.extend(left[i:])result.extend(right[j:])return result
复杂度
- 时间复杂度:O(n log n)
- 空间复杂度:O(n)
- 稳定性:稳定
五、快速排序(Quick Sort)
原理
分治思想,选一个“基准”元素,将序列分为小于和大于基准的两部分,递归排序。
实现
def quick_sort(arr):if len(arr) <= 1:return arrpivot = arr[0]left = [x for x in arr[1:] if x < pivot]right = [x for x in arr[1:] if x >= pivot]return quick_sort(left) + [pivot] + quick_sort(right)
复杂度
- 平均时间复杂度:O(n log n)
- 最坏时间复杂度:O(n²)
- 空间复杂度:O(log n) ~ O(n)
- 稳定性:不稳定
六、希尔排序(Shell Sort)
原理
将序列按一定间隔分组,对每组进行插入排序,逐步缩小间隔,最后整体插入排序。
实现
def shell_sort(arr):n = len(arr)gap = n // 2while gap > 0:for i in range(gap, n):temp = arr[i]j = iwhile j >= gap and arr[j-gap] > temp:arr[j] = arr[j-gap]j -= gaparr[j] = tempgap //= 2
复杂度
- 时间复杂度:O(n^1.3) ~ O(n²)(与步长序列有关)
- 空间复杂度:O(1)
- 稳定性:不稳定
七、堆排序(Heap Sort)
原理
利用堆这种数据结构(通常是大顶堆),每次取出堆顶元素,重建堆,直到排序完成。
实现
def heapify(arr, n, i):largest = il = 2*i + 1r = 2*i + 2if l < n and arr[l] > arr[largest]:largest = lif r < n and arr[r] > arr[largest]:largest = rif largest != i:arr[i], arr[largest] = arr[largest], arr[i]heapify(arr, n, largest)def heap_sort(arr):n = len(arr)for i in range(n//2-1, -1, -1):heapify(arr, n, i)for i in range(n-1, 0, -1):arr[0], arr[i] = arr[i], arr[0]heapify(arr, i, 0)
复杂度
- 时间复杂度:O(n log n)
- 空间复杂度:O(1)
- 稳定性:不稳定
八、计数排序(Counting Sort)
原理
适用于整数且范围不大的序列。统计每个数出现的次数,然后按顺序输出。
实现
def counting_sort(arr):if not arr:return arrmin_val = min(arr)max_val = max(arr)count = [0] * (max_val - min_val + 1)for num in arr:count[num - min_val] += 1result = []for i, c in enumerate(count):result.extend([i + min_val] * c)return result
复杂度
- 时间复杂度:O(n + k)(k为数值范围)
- 空间复杂度:O(k)
- 稳定性:稳定
九、常见排序算法复杂度对比表
算法 | 最好时间 | 最坏时间 | 平均时间 | 空间复杂度 | 稳定性 |
---|---|---|---|---|---|
冒泡排序 | O(n) | O(n²) | O(n²) | O(1) | 稳定 |
选择排序 | O(n²) | O(n²) | O(n²) | O(1) | 不稳定 |
插入排序 | O(n) | O(n²) | O(n²) | O(1) | 稳定 |
希尔排序 | O(n^1.3) | O(n²) | O(n^1.3) | O(1) | 不稳定 |
归并排序 | O(n log n) | O(n log n) | O(n log n) | O(n) | 稳定 |
快速排序 | O(n log n) | O(n²) | O(n log n) | O(log n) | 不稳定 |
堆排序 | O(n log n) | O(n log n) | O(n log n) | O(1) | 不稳定 |
计数排序 | O(n+k) | O(n+k) | O(n+k) | O(k) | 稳定 |
十、总结
- 排序算法种类繁多,选择合适的算法要结合数据规模、数据特性和实际需求。
- 面试和实际开发中,常用的高效排序有快速排序、归并排序、堆排序等。
- Python 内置的
sort()
和sorted()
使用的是 Timsort(归并+插入的优化),时间复杂度 O(n log n),稳定且高效。
建议:
- 小数据量用插入、冒泡等简单算法,大数据量优先考虑快排、归并、堆排序。
- 了解每种算法的原理和适用场景,能灵活应对各种实际问题和面试考察。
如需更多算法讲解或代码实现,欢迎留言交流!
相关文章:
常见排序算法详解及其复杂度分析
常见排序算法详解及其复杂度分析 排序算法是数据结构与算法学习中的基础内容,也是面试高频考点。本文将系统介绍几种常见的排序算法,包括它们的原理、时间复杂度、空间复杂度以及 Python 实现方法。 一、冒泡排序(Bubble Sort) …...

DARLR用于具有动态奖励的推荐系统的双智能体离线强化学习(论文大白话)
1. 概述 离线强化学习是现在强化学习研究的一个重点。相比与传统的强化学习它不需要大量的实时交互数据,仅仅依赖历史交互日志就可以进行学习。本文就是将离线强化学习用于推荐系统的一篇文章。 这篇文章主要解决的核心问题有以下几个: 1)…...

第35节:PyTorch与TensorFlow框架对比分析
引言 在深度学习领域,PyTorch和TensorFlow无疑是当前最受欢迎的两大开源框架。 自2015年TensorFlow由Google Brain团队发布,以及2016年Facebook的AI研究团队推出PyTorch以来,这两个框架一直在推动着深度学习研究和工业应用的发展。 本文将从多个维度对这两个框架进行详细对…...

企业级智能体 —— 企业 AI 发展的下一个风口?
在AI技术迅猛发展的当下,企业对AI的应用不断深入。企业级智能体逐渐受到关注,它会是企业AI发展的下一个风口吗?先来看企业典型的AI应用场景,再深入了解企业级智能体。 企业典型AI应用场景 1. 内容生成:2025年…...

【软考向】Chapter 2 程序设计语言基础知识
程序设计语言概述低级语言 —— 机器指令、汇编语言高级语言 ——翻译:汇编、解释和编译语言处理程序基础 —— 翻译给计算机,汇编、编译、解释三类编译程序基本原理 —— 词法分析、语法分析、语义分析、中间代码生成、代码优化、目标代码生成文法和语言的形式描述确定的有限…...

JavaWeb:SpringBootAOP切面实现统计方法耗时和源码解析
介绍 快速入门 1.导入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId> </dependency>2.切面类java Slf4j Aspect Component public class RecordTimeApsect {/*** 统计耗…...

RabbitMQ的其中工作模式介绍以及Java的实现
文章目录 前文一、模式介绍1. 简单模式2. 工作队列模式3. 广播模式4. 路由模式5. 通配符模式6. RPC模式7. 发布确认模式 二、代码实现1、简单模式2、工作队列模式生产者消费者消费者 1消费者 2 3、广播模式 (Fanout Mode)生产者消费者 4、路由模式 (Direct Mode)生产者消费者 5…...

vue2项目搭建
作者碎碎念:开历史倒车了,没想到不兼容,只能从vue3->vue2了。 1 vue3和vue2 这部分参考了官网的《vue3迁移指南》:Vue 3 的支持库进行了重大更新。以下是新的默认建议的摘要: 新版本的 Router, Devtools & test utils 来…...

Spring AI 源码解析:Tool Calling链路调用流程及示例
Tool工具允许模型与一组API或工具进行交互,增强模型功能,主要用于: 信息检索:从外部数据源检索信息,如数据库、Web服务、文件系统或Web搜索引擎等 采取行动:可用于在软件系统中执行特定操作,如…...

2025年- H48-Lc156 --236. 二叉树的最近公共祖先(递归、深搜)--Java版
1.题目描述 递归终止条件: 如果当前节点 root 为 null,表示到达了叶子节点的空子树; 如果当前节点是 p 或 q,就返回它(因为从这里可以回溯寻找公共祖先)。 2.思路 (1) 如果当前节…...
【人工智能】低代码-模版引擎
模板引擎是一种将数据与静态模板结合,生成动态内容的工具。它的核心作用是将业务逻辑与展示层分离,使代码更易维护、复用和管理。 核心功能 变量替换:将模板中的占位符替换为动态数据。 逻辑控制:支持条件判断(if/els…...

Hertz+Kitex快速上手开发
本篇文章以用户注册接口为例,快速上手HertzKitex 以用户注册接口来演示hertz结合kitex实现网关微服务架构的最简易版本 项目结构 api- gateway:网关实现,这里采用hertz框架 idl:接口定义用来生成kitex代码 kitex_genÿ…...
线程池配置经验总结
1. 核心线程数配置(corePoolSize) 1.1 核心线程数的配置影响因素 CPU核心数 CPU密集型任务:核心线程数 ≈ CPU核心数 1IO密集型任务:核心线程数 ≈ CPU核心数 (1 平均等待时间/平均计算时间) 一般经验值:2 CPU核心数 内存大小ÿ…...

机器学习课程设计报告 —— 基于二分类的岩石与金属识别模型
机器学习课程设计报告 题 目: 基于二分类的岩石与金属识别模型 专 业: 机器人工程 学生姓名: XXX 指导教师: XXX 完成日期:…...

分词算法BPE详解和CLIP的应用
一、TL;DR BPE通过替换相邻最频繁的字符和持续迭代来实现压缩CLIP对text进行标准化和预分词后,对每一个单词进行BPE编码和查表,完成token_id的转换 二、BPE算法 2.1 核心思想和原理 paper:Neural Machine Translation of Rare…...

STM32F103_Bootloader程序开发02 - Bootloader程序架构与STM32F103ZET6的Flash内存规划
导言 在工业设备和机器人项目中,固件远程升级能力已成为提升设备维护性与生命周期的关键手段。本文将围绕STM32平台,系统性介绍一个简洁、可靠的Bootloader程序设计思路。 我们将Bootloader核心流程划分为五大功能模块: 启动入口与升级模式判…...

通过Auto平台与VScode搭建远程开发环境(以Stable Diffusion Web UI为例)
文章目录 Stable Diffusion Web UI一、🎯主要功能概述二、🧠支持的主要模型体系三、📦安装方式简述✅ 一、前提准备✅ 二、安装步骤混乱版本(仅用于记录测试过程)第一步:克隆仓库(使用清华大学镜…...
Windows_Rider C#语言开发环境构建
Windows_Rider C#语言开发环境构建 一、C#语言简介历史背景语言特点应用领域开发工具未来发展方向 二、Rider简介功能特点支持的语言免费版本最新更新 三、开发环境构建(一)安装 JetBrains Rider(二)安装 .NET SDK(三&…...

Unity 打包程序全屏置顶无边框
该模块功能: 1. 打包无边框 2. 置顶 3. 不允许切屏 4.多显示器状态下,程序只在主显示上运行 5.全屏 Unity 打包设置: 如果更改打包设置,最好将Version版本增加一下,否则可能不会覆盖前配置文件 代码: 挂在场景中即可 using UnityEngine; using System; // 确保这行存…...

GAMES104 Piccolo引擎搭建配置
操作系统:windows11 家庭版 inter 17 12 th 显卡:amd 运行内存:>12 1、如何构建? 在github下载:网址如下 https://github.com/BoomingTech/Piccolo 下载后安装 git、vs2022 Git Visual Studio 2022 IDE - …...
第 29 场 蓝桥·算法入门赛
1. 不油腻的星座 "我们只欢迎不油腻的星座!" 在「非哺乳动物星座联盟」的派对上,主持人突然宣布:"请在场的 12 星座中,名字里包含哺乳动物的立刻离场",结果白羊、金牛、狮子、摩羯 44 个星座红着脸…...

用service 和 SCAN实现sqlplus/jdbc连接Oracle 11g RAC时负载均衡
说明 11.2推出的SCAN ,简化了客户端连接(当增加或者减少RAC实例时,不需要修改客户端配置,并且scan listener有各个实例的负载情况,可以实现连接时负载均衡。 不过客户端需要使用专门建立的service,而不能用RAC数据库…...
Jenkins 中获取构建触发用户的完整指南
在持续集成(CI/CD)流程中,追踪构建的触发用户是排查问题、审计操作或通知相关人员的重要需求。然而,Jenkins 默认不直接暴露触发构建的用户信息,尤其是在自动触发场景下。本文将详细介绍 多种获取 Jenkins 构建触发用户的方法,涵盖插件使用、脚本编写和 API 查询,并提供…...

防火墙流量管理
带宽管理介绍 针对企业用户流量,防火墙提供了带宽管理功能,基于出/入接口、源/目的安全区域、源/目的地址、时间段、报文DSCP优先级等信息,对通过自身的流量进行管理和控制。 带宽管理提供带宽限制、带宽保证和连接数限制功能,可…...
uniapp+ts 多环境编译
1. 创建项目 npx degit dcloudio/uni-preset-vue#vite-ts [项目名称] 2.创建env目录 多环境配置文件命名为.env.别名 添加index.d.ts interface ImportMetaEnv{readonly VITE_ENV:string,readonly UNI_PLATFORM:string,readonly VITE_APPID:string,readonly VITE_NAME:stri…...

Linux系统移植①:uboot概念
Linux系统移植①:uboot概念 uboot概念 1、uboot是一个比较复杂的裸机程序。 2、uboot就是一个bootloader,作用就是用原于启动Linux或其他系统。uboot最主要的工作就是初始化DDR。因为Linux是运行再DDR里面的。一般Linux镜像zImage(uImage)设…...
linux 学习之位图(bitmap)数据结构
bitmap 可以高效地表示大量的布尔值,并且在许多情况下可以提供快速的位操作。 1 定义 enum device_state{DOWN,DOEN_DONE,MAILBOX_READY,MAILBOX_PENDING,STATE_BUILD };DECLARE_BITMAP(state,STATE_BUILD);相当于》u32 state[BITS_TO_LONGS(4)] BIT…...

DAY 35
import torch import torch.nn as nn import torch.optim as optim from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.preprocessing import MinMaxScaler import time import matplotlib.pyplot as plt# 设置GPU设…...
理论篇一:了解webpack是什么,能解决什么问题,如何使用
Webpack 是前端工程化的核心工具之一,它的核心目标是将前端项目中的各种资源(JS、CSS、图片等)高效打包成浏览器可运行的静态文件。以下是系统化的解答: 一、Webpack 是什么? 1. 定义 Webpack 是一个 静态模块打包工具(Static Module Bundler),它通过分析项目的依赖关…...

AWS EC2实例安全远程访问最佳实践
EC2 远程连接方案对比 远程访问 Amazon EC2 实例主要有以下四种方式: Secure Shell (SSH) 远程访问AWS Systems Manager 会话管理器适用于 Linux 实例的 EC2 Serial ConsoleAmazon EC2 Instance Connect SSH 远程访问 SSH(Secure Shell)广…...