排序算法 时间复杂度、空间复杂度

一、时间复杂度

1. 什么是时间复杂度
  • 记为大O,是衡量算法运行效率的重要指标,描述了算法运行所需时间是如何随着输入规模(通常用n来表示)变化的(一般)。也可以说用来表示算法语句总的执行次数随n的增长趋势。
2. 常见时间复杂度的分类
时间复杂度描述例子
O(1)常数时间:与输入大小无关访问数组中的某元素
O(log n)对数时间:规模缩小一半二分查找
O(n)线性时间:与输入成正比遍历数组
O(n log n)线性对数时间快速排序、归并排序
O(n^2)二次方时间:嵌套循环冒泡排序、插入排序
O(2^n)指数时间未优化递归解决斐波那契数列
O(n!)阶乘时间解决全排列问题
3. 时间复杂度的分析方法
  • 确定基本操作的时间复杂度
  • 分析循环结构或递归共识
  • 省略低阶项和常数,仅保留增长最快的项

二、空间复杂度

1. 什么是空间复杂度
  • 同样使用大O来表示,用来衡量算法在运行过程中所需的存储空间随输入规模(n)的变化。
2. 空间复杂度的分类
空间复杂度描述示例算法
O(1)常数空间:不需要额外空间原地排序算法(如冒泡排序)
O(log n)对数空间:递归深度相关二分查找递归实现
O(n)线性空间:与输入大小相关动态规划、哈希表
O(n^2)二次空间:二维矩阵相关矩阵操作、图的存储
3. 空间复杂度的分析方法
  • 统计变量:分析算法中引入了多少额外变量
    • 普通变量占用 O(1) 空间。
    • 数组或列表根据其大小占用 O(n) 空间。
  • 递归深度:递归算法会消耗额外的栈空间,其大小由递归深度决定。
    • 递归调用栈的深度为 ( d ),每次调用需要固定大小的空间,则总空间复杂度为 O(d) 。
  • 动态数据结构:动态创建的结构(如链表、树、哈希表)占用的空间与输入规模相关。
4. 时间复杂度和空间复杂度的权衡
  • 有些算法可以通过增加空间来换取时间效率(如动态规划的备忘录法)。
  • 也可以通过减少空间来牺牲时间(如递归转循环)。

三、排序算法的比较

1. 基于比较的排序
  • 依赖元素之间的比较操作。
  • 包括冒泡排序、插入排序、选择排序、归并排序、快速排序、堆排序等。
2. 非比较排序
  • 不直接比较元素大小,而是利用元素的特性。
  • 包括计数排序、桶排序和基数排序。

3. 各排序算法的比较

排序算法时间复杂度(最坏/平均/最好)空间复杂度稳定性特点与适用场景
冒泡排序O(n^2) / O(n^2) / O(n)O(1)稳定简单实现,适合小规模数据或数据接近有序的场景
选择排序O(n^2)O(1)不稳定简单但效率低,不适合大数据
插入排序O(n^2) / O(n^2) / O(n)O(1)稳定适合少量数据或几乎有序的数组
归并排序O(n log n)O(n)稳定适合大数据、需要稳定性的场景
快速排序O(n^2) / O(n log n) / O(n log n)O( log n)不稳定高效通用的排序算法,适合大规模数据
堆排序O(n log n)O(1)不稳定用于堆结构的场景,内存使用较少
计数排序O(n + k)O(n + k)稳定适用于数据范围较小且整数数据的场景
桶排序O(n + k)O(n + k)稳定适合数据均匀分布的场景
基数排序O(n * k)O(n + k)稳定适合多位数值或字符串的排序
  • 稳定性:当值相等时,排序后是否保持原顺序。

四、各算法介绍

1. 冒泡排序
  • 原理:两两比较相邻元素,将较大的元素逐步“冒泡”到数组末尾。
  • 特点:简单易懂,但性能较低。
  • 适用场景:小数据量或数据接近有序时。
2. 选择排序
  • 原理:每次从未排序部分选择最小(或最大)的元素,放到已排序部分末尾。
  • 特点:实现简单,但多次交换导致效率低。
  • 适用场景:数据量小,稳定性不要求高。
3. 插入排序
  • 原理:将未排序元素逐一插入到已排序部分的适当位置。
  • 特点:对几乎有序的数据效果较好。
  • 适用场景:小规模数据、接近有序数据。
4. 快速排序
  • 原理:选定一个基准值,将数组划分为小于和大于基准值的两部分,递归排序。
  • 特点:平均性能优越,但最坏情况下效率低(如有序数组)。
  • 适用场景:大规模数据,效率高要求。
5. 归并排序
  • 原理:将数组递归分成两部分,分别排序后合并。
  • 特点:稳定且效率高,但需要额外空间。
  • 适用场景:需要稳定性,且内存足够的场景。

总结与选择建议

  1. 数据量小或几乎有序

    • 使用 插入排序冒泡排序
  2. 大数据量,追求效率

    • 快速排序:时间效率高,适用范围广。
    • 归并排序:稳定,适合外部排序。
  3. 内存有限

    • 堆排序:占用空间小,但不稳定。
  4. 整数或范围较小数据(外部排序)

    • 计数排序桶排序基数排序
  5. 不稳定的排序

    • 选择排序快速排序堆排序
  6. 时间复杂度稳定为O( n log n )的排序

    • 归并排序堆排序
  7. 速记方法

    • 平均时间复杂度O(n^2),较为低效,但空间复杂度为O(1)的排序算法:
      • 冒泡:稳定
      • 选择:不稳定
      • 插入:稳定
    • 平均时间复杂度O(n log n),较为高效的算法:
      • 归并:稳定,空间复杂度为O(n)
      • 快速:不稳定,空间复杂度为O(log n),时间复杂度最坏时为O(n^2)
      • 堆:不稳定,空间复杂度为O(1)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

wsl2中kali linux下的docker使用教程(教程总结)

一、前言 上一篇关于kali linux的文章是图形界面的配置,这里作者准备补充两点,一点是在使用VNC时,如果F8不能用的话,可以试试AltF8;然后就是VNC在初始化设置时的三个设置选项依次是密码、再输一次以及设置仅观看密码。…

Linux系统使用valgrind分析C++程序内存资源使用情况

内存占用是我们开发的时候需要重点关注的一个问题,我们可以人工根据代码推理出一个消耗内存较大的函数,也可以推理出大概会消耗多少内存,但是这种方法不仅麻烦,而且得到的只是推理的数据,而不是实际的数据。 我们可以…

【通俗理解】ELBO(证据下界)——机器学习中的“情感纽带”

【通俗理解】ELBO(证据下界)——机器学习中的“情感纽带” 关键词提炼 #ELBO #证据下界 #变分推断 #机器学习 #潜变量模型 #KL散度 #期望 #对数似然 第一节:ELBO的类比与核心概念【尽可能通俗】 ELBO,即证据下界,在…

【pyspark学习从入门到精通14】MLlib_1

目录 包的概览 加载和转换数据 在前文中,我们学习了如何为建模准备数据。在本文中,我们将实际使用这些知识,使用 PySpark 的 MLlib 包构建一个分类模型。 MLlib 代表机器学习库。尽管 MLlib 现在处于维护模式,即它不再积极开发…

业务架构、数据架构、应用架构和技术架构

TOGAF(The Open Group Architecture Framework)是一个广泛应用的企业架构框架,旨在帮助组织高效地进行架构设计和管理。 TOGAF 的核心就是由我们熟知的四大架构领域组成:业务架构、数据架构、应用架构和技术架构。 企业数字化架构设计中的最常见要素是4A 架构。 4…

阿里巴巴官方「SpringCloudAlibaba全彩学习手册」限时开源!

最近我在知乎上看过的一个热门回答: 初级 Java 开发面临的最大瓶颈在于,脱离不出自身业务带来的局限。日常工作中大部分时间在增删改查、写写接口、改改 bug,久而久之就会发现,自己的技术水平跟刚工作时相比没什么进步。 所以我们…

后端数据增删改查基于Springboot+mybatis mysql 时间根据当时时间自动填充,数据库连接查询不一致,mysql数据库连接不好用

目录 后端数据增删改查Springboot 实体(entity)类引进添加UserMapper接口 创建对用的UserController注意数据库查询不一致新增数据更新删除postman测试 后端数据增删改查 基于之前构建系统,实现用户数据的CRUD。 打开navicat16,…

堆外内存泄露排查经历

优质博文:IT-BLOG-CN 一、问题描述 淘宝后台应用从今年某个时间开始docker oom的量突然变多,确定为堆外内存泄露。 后面继续按照上一篇对外内存分析方法的进行排查(jemalloc、pmap、mallocpmap/mapsNMTjstackgdb),但都没有定位到问题。至于…

WebSocket详解、WebSocket入门案例

目录 1.1 WebSocket介绍 http协议: webSocket协议: 1.2WebSocket协议: 1.3客户端(浏览器)实现 1.3.2 WebSocket对象的相关事宜: 1.3.3 WebSOcket方法 1.4 服务端实现 服务端如何接收客户端发送的请…

Vue3 源码解析(三):静态提升

什么是静态提升 Vue3 尚未发布正式版本前,尤大在一次关于 Vue3 的分享中提及了静态提升,当时笔者就对这个亮点产生了好奇,所以在源码阅读时,静态提升也是笔者的一个重点阅读点。 那么什么是静态提升呢?当 Vue 的编译器…

C++优选算法十四 优先级队列(堆)

C 中的优先级队列(Priority Queue)是一种容器适配器,它提供队列的功能,但元素不是按照插入的顺序被访问,而是根据它们的优先级被访问。默认情况下,优先级队列是一个最大堆(Max-Heap)…

综合练习--轮播图

本篇博客将教大家实现一个基础的轮播图。 源代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0&qu…

“AI玩手机”原理揭秘:大模型驱动的移动端GUI智能体

作者&#xff5c;郭源 前言 在后LLM时代&#xff0c;随着大语言模型和多模态大模型技术的日益成熟&#xff0c;AI技术的实际应用及其社会价值愈发受到重视。AI智能体&#xff08;AI Agent&#xff09;技术通过集成行为规划、记忆存储、工具调用等机制&#xff0c;为大模型装上…

光伏电站的智慧施工详解

光伏电站的智慧施工是利用先进的技术和管理方法&#xff0c;提高施工效率、质量和安全性&#xff0c;降低成本&#xff0c;实现光伏电站建设的智能化、数字化和绿色化。 下面从鹧鸪云智慧施工软件详细施工管理的步骤说起。 项目总览 包含我负责的项目、我参与的项目、我创建…

django——创建 Django 项目和 APP

2.创建 Django 项目和 APP 命令&#xff1a; 创建Django项目 django-admin startproject name 创建子应用 python manager.py startapp name 2.1 创建工程 在使用Flask框架时&#xff0c;项目工程目录的组织与创建是需要我们自己手动创建完成的。 在django中&#xff0c;…

李春葆《数据结构》-课后习题代码题

一&#xff1a;假设不带权有向图采用邻接矩阵 g 存储&#xff0c;设计实现以下功能的算法&#xff1a; &#xff08;1&#xff09;求出图中每个顶点的入度。 代码&#xff1a; void indegree(MatGraph g){int i,j,n;printf("各个顶点的入度&#xff1a;\n");for(i…

wsl安装

一. wsl简介 1. wsl和wsl2的区别 wsl需要把linux命令翻译为windows命令&#xff0c;性能差一些。 wsl2直接使用linux内核&#xff0c;不需要翻译&#xff0c;性能好&#xff0c;但开销相对大一点&#xff0c;因为需要多运行一个hyper-v虚拟机 (并非完整的虚拟机&#xff0c;是…

Java-06 深入浅出 MyBatis - 一对一模型 SqlMapConfig 与 Mapper 详细讲解测试

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 大数据篇正在更新&#xff01;https://blog.csdn.net/w776341482/category_12713819.html 目前已经更新到了&#xff1a; MyBatis&#xff…

GPT中转站技术架构

本文介绍阿波罗AI中转站&#xff08;https://api.ablai.top/&#xff09;的技术架构&#xff0c;该中转API的技术架构采用了分布式架构、智能调度和API中转等技术&#xff0c;确保了全球范围内的高效访问和稳定运行。以下是对该技术架构的详细分析&#xff1a; 分布式架构 分…

远程服务器Docker使用本地代理加速访问外部资源

Docker在pull镜像的时候非常缓慢&#xff0c;但是远程主机没有安装代理&#xff0c;就很为难&#xff0c;现在分享一个可以让远程服务器使用本地代理加速的方法 配置Docker代理 新建文件夹 mkdir -p /etc/systemd/system/docker.service.d 切换到这个文件夹里 cd /etc/system…