常见的排序算法过程和比较分析

比较分析

排序类别排序算法时间复杂度(最好)时间复杂度(最坏)时间复杂度(平均)辅助空间复杂度稳定性
插入排序直接插入排序O(n)O(n²)O(n²)O(1)稳定
插入排序折半插入排序O(n)O(n²)O(n²)O(1)稳定
插入排序希尔排序O(n)O(n²)O(n^1.3)O(1)不稳定
交换排序冒泡排序O(n)O(n²)O(n²)O(1)稳定
交换排序快速排序O(nlog₂n)O(n²)O(nlog₂n)O(log₂n)不稳定
选择排序简单选择排序O(n²)O(n²)O(n²)O(1)不稳定
选择排序堆排序O(nlog₂n)O(nlog₂n)O(nlog₂n)O(1)不稳定
归并排序二路归并排序O(nlog₂n)O(nlog₂n)O(nlog₂n)O(n)稳定
基数排序基数排序O(d(n + k))O(d(n + k))O(d(n + k))O(n + k)稳定

快速排序

步骤:

  1. 任取一元素作为枢轴(pivot),图中取的枢轴值为 56。
  2. 将序列划分成两部分,左部分元素值 <= 枢轴,右部分元素值 >= 枢轴。
  3. 然后递归处理左右部分,直到子序列为空或只剩一个元素。
    图示:
    pivot = 56
索引012345678910
空(56)23457669204593168227
👆left👆right
index = 0 存放枢轴 56 ,
(1) 若 right 对应的值小于 56 则填到 left 处,然后 left++(此时 right 处有空需要左边的填到右边)
(2) 若 right 对应的值大于 56 则不需改变只需要 right--
(3) 若 (1) 成立则看 left++后指向的位置是否大于 56,若大于 56 则填到 right 处,后 right--;
若 left++后的值小于 56 则不改变位置 left++(空位仍在右边)
(4) 重复上述过程直到划分完毕
  • 选择枢轴(pivot = 56):
    • 左部分(left):<= pivot
    • 右部分(right):>= pivot
  • 操作步骤:
    • right 从右往左找比枢轴小的元素去填 left 的坑。
    • left 从左往右找比枢轴大的元素去填 right 的坑。

![[Pasted image 20241226134232.png]]

冒泡排序

步骤:

  1. 从序列的第一个元素开始,依次比较相邻的两个元素。
  2. 如果前一个元素大于后一个元素,则交换它们的位置。
  3. 对整个序列重复上述比较和交换操作,每次遍历都会将当前未排序部分的最大元素 “冒泡” 到末尾。
  4. 持续进行上述操作,直到整个序列有序。

图示:
假设初始序列为:

索引012345678910
2723457669204593168256

(1) 第一轮比较:

  • 比较第 0 个元素和第 1 个元素(27 和 23),因为 27 > 23,交换位置。
  • 序列变为:23,27,45,76,69,20,45,93,16,82,56
  • 比较第 1 个元素和第 2 个元素(27 和 45),不交换。
  • 依次类推,比较第 2 个元素和第 3 个元素(45 和 76),不交换……
  • 比较第 9 个元素和第 10 个元素(82 和 56),因为 82 > 56,交换位置。
  • 第一轮结束后,最大的元素 93 “冒泡” 到了末尾。
    (2) 第二轮比较:
  • 重复上述比较和交换操作,但这次只需要比较到倒数第二个元素,因为最大元素已经在末尾了。
  • 第二轮结束后,第二大的元素 82 “冒泡” 到了倒数第二个位置。
    (3) 持续进行上述操作:
  • 每一轮都会将当前未排序部分的最大元素移动到正确位置。
  • 直到整个序列有序。
  • 操作步骤总结:
    • 每一轮从序列的开头开始,依次比较相邻元素,如果顺序不对就交换。
    • 每一轮过后,未排序部分的最大元素就会移动到末尾,下一轮比较的范围就减少一个元素。
    • 重复这个过程,直到整个序列有序。
      优化方式
  • 设置一个 bool 类型的swapped 变量每一轮初始化为 false,只要在本轮内存在交换操作,那么久 swapped = true
  • 如果某一轮执行完毕后 swapped 仍然为 fasle 说明在此轮中没有交换产生,数列已经有序
    (这样防止了在排序过程中,某轮结束后,已经有序但是仍然遍历的情况)

![[Pasted image 20241226135646.png]]

堆排序

  • 是个完全二叉树 (除最下面一层都是满的,最下面一层从左到右依次排序,没有空的)
  • 大根堆 任意节点>=其左右孩子
  • 小根堆 任意节点<=其左右孩子
    一般用顺序存储存放堆
    如下所示 上边是逻辑结婚下边是存储结构

![[Pasted image 20241226145531.png]]

下标从 1 开始 index有这个规律
父亲 = ⌊ i / 2 ⌋ \lfloor i/2\rfloor i/2 左孩子 = 2 i 2i 2i 右孩子 = 2 i + 1 2i+1 2i+1

步骤

  1. 建堆
    • 从最后一个非叶结点开始依次向下调整
  2. 排序
    • 每轮堆顶换到最后,向下调整新的堆顶 (n - 1) 轮

![[Pasted image 20241226151956.png]]

手算

快速排序

  • 手算快速排序时 L R 指针左右移动
  • R 指到< pivot 的放到 L 处(L 原先为空, 放入后 R 为空 L 非空)
    然后视角切换到 L
    若 R 未指到< pivot 的则 R 继续移动
  • L 指到> pivot 的放到 R 处(R 原先为空,放入后 L 为空 R 非空 )
    然后视角切换到 R
    若 L 未指到> pivot 的则 L 继续移动
  • L == R 时,pivot 归位
  • 递归的处理 pivot 左右两边的部分,方法同上

堆排序

看到一组乱序关键字时

  • 先按照关键字目前的顺序,依次填入一棵完全二叉树 (横着一行一行的填入)
  • 然后依次调整树为大根堆/小根堆
  • 调整完成之后树的根节点和最后一个关键字 (序号最大的) 调换位置
    此时的便是第一轮排序后的结果 (最后一个也就是刚由根节点调换过来的关键字已归位)
  • 然后再不包括最后一个关键字的基础上对于前 n-1 个数重新做上述工作
  • 直到每个关键字都归位

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

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

相关文章

随笔 | 写在2024的最后一天

. 前言 转眼又到了一年的末端。过去这一年&#xff0c;和前些年有些不同&#xff0c;变化巨大&#xff0c;感触良多。多到一时竟不知从何开始写。今天这篇随笔&#xff0c;因为时间有限&#xff0c;可能文法也会有些凌乱&#xff0c;就是想到哪里写到哪里&#xff0c;如果未来…

【QGIS入门实战精品教程】7.3:QGIS制作千层饼(DEM+等高线+影像+TIN)

文章目录 一、效果展示二、数据准备三、制作过程1. 打开软件2. 添加图层3. 制作千层饼一、效果展示 二、数据准备 订阅专栏后,从专栏配套案例数据包中的7.3.rar中获取。 1. dem 2. 影像 3. 等高线 4. tin 三、制作过程 1. 打开软件 打开QGIS软件。 QGIS软件主界面。

如何将CSDN文章 导出为 PDF文件

一、首先&#xff0c;打开我们想要导出为 PDF格式的 CSDN文章&#xff0c;以下图为例。 二、按 F12 调出浏览器调式模式后&#xff0c;选择 控制台 三、在控制台处粘贴代码 代码&#xff1a; (function(){ use strict;var articleBox $("div.article_content"…

Apache Hive常见问题

入门问题 什么是Apache Hive&#xff1f; 解释Hive的用途。Hive作为基于Hadoop的数据仓库工具是如何工作的&#xff1f;与传统关系型数据库相比&#xff0c;使用Hive有什么优势&#xff1f; Hive和关系型数据库管理系统&#xff08;RDBMS&#xff09;之间的区别是什么&#…

HTML——54. form元素属性

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>form元素属性</title></head><body><!--form标签用于创建一个表单&#xff0c;会将里面的内容一起发送服务器&#xff0c;结构类似于表格--><!-…

告别 $arr[0]: PHP 和 Laravel 中更优雅的数组处理方式

你是否曾经历过这样的惊魂时刻&#xff1a;线上代码突然崩溃&#xff0c;只因访问了一个不存在的数组元素&#xff1f;或者更糟的是&#xff0c;应用开始疯狂抛出错误&#xff0c;而你却毫无头绪&#xff1f;这一切的罪魁祸首可能就是看似人畜无害的硬编码数组索引&#xff0c;…

二十三种设计模式-单例模式

单例模式&#xff08;Singleton&#xff09;&#xff1a;确保一个类只有一个实例&#xff0c;并提供一个全局访问点。 单例模式两种实现方法&#xff1a;懒汉式和饿汉式。 懒汉式&#xff08;Lazy Initialization&#xff09; 懒汉式单例模式在第一次被使用时才创建实例&…

聊聊长连接和短连接

大家好&#xff0c;我是G探险者。 现在的软件架构无非就是两种架构模式&#xff0c;C/S架构&#xff0c;B/S架构。 C/S架构&#xff1a;C就是客户端client&#xff0c;S就是服务端server。 B/S架构&#xff1a;B就是浏览器browser,S就是服务端server。 当别人问你的项目是什么架…

【Linux报告】实训六 重置超级用户密码

实训六 重置超级用户密码 2018编写-今日公布 【练习一】忘记root密码 步骤一&#xff1a;开启或重启系统&#xff0c;并且要在五秒之内按任何键&#xff1b; 步骤二&#xff1a;按任意键&#xff0c;停止进入系统&#xff0c;按【e】键&#xff0c;跳转新页面&#xff0c;再…

一种pod容器动态挂卷方案

一、背景 1.1 个人调试kvm 我们这边基于云平台的k8skubevirt&#xff0c;给安卓手机领域的开发工程师们提供了独占式虚拟机资源。这些资源主要用于工程师的个人级开发与调试&#xff0c;因此有如下特点&#xff1a; 使用时间与工作时间强相关&#xff0c;即工程师工作时间使…

Docker Compose 构建 EMQX 集群 实现mqqt 和websocket

EMQX 集群化管理mqqt真香 目录 #目录 /usr/emqx 容器构建 vim docker-compose.yml version: 3services:emqx1:image: emqx:5.8.3container_name: emqx1environment:- "EMQX_NODE_NAMEemqxnode1.emqx.io"- "EMQX_CLUSTER__DISCOVERY_STRATEGYstatic"- …

如何在没有 iCloud 的情况下将数据从 iPhone 传输到 iPhone

概括 您可能会遇到将数据从 iPhone 转移到 iPhone 的情况&#xff0c;尤其是当您获得新的 iPhone 15/14 时&#xff0c;您会很兴奋并希望将数据转移到它。 使用iCloud最终可以做到这一点&#xff0c;但它的缺点也不容忽视&#xff0c;阻碍了你选择它。例如&#xff0c;您需要…

智能工厂的设计软件 应用场景的一个例子:为AI聊天工具添加一个知识系统 之10 方案再探之1:特定于领域的模板 之1 随想交流

前面的项目再次不能继续。不得已再一次重新建了这个项目&#xff0c;并以当前修改版本的项目文件为附件开始了今天的沟通。所以 标明是“方案再探” 在新建这个项目的同时&#xff0c;就将项目文件作为附件添加进去&#xff0c;然后开始。 文件链接&#xff1a;智能工厂的设计…

异步背后的奥秘:事件循环

异步背后的奥秘&#xff1a;事件循环 复习环节 JavaScript运行时 我们都知道&#xff0c;JavaScript本身是一个单线程的&#xff0c;那JavaScript是如何处理同时发生的多个任务的呢&#xff1f; 首先JavaScript引擎运行在一个容器中&#xff0c;这个容器可能是浏览器或者nod…

Live555、FFmpeg、GStreamer介绍

Live555、FFmpeg 和 GStreamer 都是处理流媒体和视频数据的强大开源框架和工具&#xff0c;它们广泛应用于实时视频流的推送、接收、处理和播放。每个框架有不同的设计理念、功能特性以及适用场景。下面将详细分析这三个框架的作用、解决的问题、适用场景、优缺点&#xff0c;并…

CUDA与Microsoft Visual Studio不兼容问题

简介&#xff1a;在安装一些 python库时&#xff0c;涉及到第三方库&#xff08;特别是需要引用 C 代码&#xff09;时&#xff0c;通常的安装方式会涉及到编译过程&#xff0c;通常称为"源代码安装"&#xff08;source installation&#xff09;&#xff0c;或是 “…

Unity2D无限地图的实现(简单好抄)

说明&#xff1a;本教程实现的是在2D游戏中玩家在游戏中上下左右移动的时候自动进行地图拼接的功能&#xff0c;如果你只想实现左右移动的无限地图&#xff0c;那么这篇博客也能起到一定参考作用。 思路 第一步&#xff1a; 创建一个10*10的2D游戏对象当做地图 第二步创建一个…

Object.defineProperty() 完整指南

Object.defineProperty() 完整指南 1. 基本概念 Object.defineProperty() 方法允许精确地添加或修改对象的属性。默认情况下&#xff0c;使用此方法添加的属性是不可修改的。 1.1 基本语法 Object.defineProperty(obj, prop, descriptor)参数说明&#xff1a; obj: 要定义…

使用云计算开发App 有哪些坑需要避免

当我们在云计算环境下开发App时&#xff0c;往往会觉得一切都变得“轻松”了。毕竟&#xff0c;云计算提供了无限的计算资源、灵活的存储方案&#xff0c;还有自动化的服务&#xff0c;仿佛有了一个万能的工具箱&#xff0c;啥都能搞定。可是&#xff0c;别被这种“轻松”外表骗…

C13.【C++ Cont】初识string类字符串的迭代器

目录 1.迭代器的定义 2.迭代器的作用 3.string类字符串的常用迭代器 4.第3点的两个迭代器的使用 示例代码1:解引用 运行结果 示例代码2 运行结果 示例代码3:用迭代器正序遍历字符串 运行结果 示例代码4:用迭代器逆序遍历字符串 运行结果 示例代码5:用迭代器修改字…