排序算法笔记

devtools/2024/10/22 4:25:31/

1. 冒泡排序(Bubble Sort)

  • 原理:通过重复遍历数组,每次比较相邻元素并交换它们的位置,使较大的元素逐步“冒泡”到数组的末尾。
  • 时间复杂度:O(n²)
  • 空间复杂度:O(1)
  • 稳定性:稳定

2. 选择排序(Selection Sort)

  • 原理:每次从未排序的部分中选出最小或最大的元素,将其放到已排序部分的末尾。
  • 时间复杂度:O(n²)
  • 空间复杂度:O(1)
  • 稳定性:不稳定

3. 插入排序(Insertion Sort)

  • 原理:将未排序的元素逐个插入到已排序部分的正确位置,逐步构建已排序数组。
  • 时间复杂度:O(n²)
  • 空间复杂度:O(1)
  • 稳定性:稳定

4. 希尔排序(Shell Sort)

  • 原理:通过比较相距一定间隔的元素,逐步减少间隔,最后使用插入排序完成整个排序过程。
  • 时间复杂度:O(n log n) ~ O(n²) (取决于步长序列)
  • 空间复杂度:O(1)
  • 稳定性:不稳定

5. 归并排序(Merge Sort)

  • 原理:递归地将数组分成两半,然后合并两个已排序的子数组。
  • 时间复杂度:O(n log n)
  • 空间复杂度:O(n)
  • 稳定性:稳定

6. 快速排序(Quick Sort)

  • 原理:选择一个基准元素,将数组分成比基准元素小和大的两个部分,然后递归地排序子数组。
  • 时间复杂度:O(n log n) (最差情况为 O(n²))
  • 空间复杂度:O(log n) ~ O(n)
  • 稳定性:不稳定

7. 堆排序(Heap Sort)

  • 原理:利用堆数据结构(通常是最大堆或最小堆)来排序数组。
  • 时间复杂度:O(n log n)
  • 空间复杂度:O(1)
  • 稳定性:不稳定

8. 计数排序(Counting Sort)

  • 原理:通过计数每个元素出现的次数,计算每个元素在排序后的位置,然后将其放入正确的位置。
  • 时间复杂度:O(n + k) (k是元素的取值范围)
  • 空间复杂度:O(n + k)
  • 稳定性:稳定

9. 桶排序(Bucket Sort)

  • 原理:将元素分配到不同的桶中,对每个桶进行排序,然后将桶中的元素按顺序合并。
  • 时间复杂度:O(n + k) (k是桶的数量)
  • 空间复杂度:O(n + k)
  • 稳定性:稳定

10. 基数排序(Radix Sort)

  • 原理:按元素的个位、十位等位数分别进行排序,通常使用计数排序作为子过程。
  • 时间复杂度:O(d * (n + k)) (d为位数,k为基数)
  • 空间复杂度:O(n + k)
  • 稳定性:稳定

常见排序算法的对比

排序算法时间复杂度(平均)时间复杂度(最坏)空间复杂度稳定性
冒泡排序O(n²)O(n²)O(1)稳定
选择排序O(n²)O(n²)O(1)不稳定
插入排序O(n²)O(n²)O(1)稳定
希尔排序O(n log n)O(n²)O(1)不稳定
归并排序O(n log n)O(n log n)O(n)稳定
快速排序O(n log n)O(n²)O(log n)不稳定
堆排序O(n log n)O(n log n)O(1)不稳定
计数排序O(n + k)O(n + k)O(n + k)稳定
桶排序O(n + k)O(n²)O(n + k)稳定
基数排序O(d * (n + k))O(d * (n + k))O(n + k)稳定

这些排序算法在不同场景下各有适用性,选择哪种排序算法取决于数据规模、是否需要稳定性以及空间复杂度的要求。


http://www.ppmy.cn/devtools/125775.html

相关文章

【bug】paddleocr draw_ocr_box_txt ValueError: incorrect coordinate type

【bug】paddleocr draw_ocr_box_txt ValueError: incorrect coordinate type 环境 python 3.10.15pillow 10.4.0 paddleocr 2.8.1错误详情 错误文本 Traceback (most recent call last):....draw_left.polygon(box, fillcolor)ValueError: inco…

unity 调整skinweight (皮肤权重),解决:衣服穿模问题

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、skinweight 是什么?二、代码控制:可根据平台切换1.引入库 总结 前言 最近遇到一个问题,人物模型的衣服穿模&#xff08…

EventSource是什么,和axios区别,以及SSE是什么

EventSource、axios以及SSE(Server-Sent Events)在Web开发中各自扮演着不同的角色,以下是它们的详细解释及区别: EventSource 定义:EventSource是浏览器提供的用于接收SSE事件的接口。它允许客户端通过HTTP协议与服务…

GaussDB 主备版本8 -数据库对象 学习

1 表空间 1.1 GaussDB自带了两个表空间:pg_default和pg_global 1.1.1 默认表空间pg_default:用来存储非共享系统表、用户表、用户表index、临时表、临时表index、内部临时表的默认表空间。对应存储目录为实例数据目录下的base目录。 1.1.2 共享表空间pg…

OpenCV视频I/O(20)视频写入类VideoWriter之用于将图像帧写入视频文件函数write()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::VideoWriter::write() 函数用于将图像帧写入视频文件。 该函数/方法将指定的图像写入视频文件。图像的大小必须与打开视频编写器时指定的大…

小牛问题(c++)

题目描述 一头刚出生的小母牛,4年后生一头小母牛,即第4年会生一头小母牛,以后每年生一头,现有一头刚出生的小母牛,问n年后共有多少头牛? 输入 输入n 输出 输出共有多少头牛 样例输入 复制 10 样例输…

OpenAI Canvas最新发布,编程和写作迎来全新史诗级加强!

文章目录 零、前言一、GPT-40 with canvas操作指导写作领域加强建议编辑调整长度阅读水平添加最后的润色添加表情 编程领域加强选中代码问问题添加评论(添加注释)添加日志转换语言代码审查 二、感受 零、前言 最新消息,国庆期间OpenAI有大动…

docker详解介绍+基础操作 (四)容器镜像

一.镜像结构和原理 Docker 镜像是 Docker 技术的核心组成部分之一,它用于封装应用程序及其依赖项,以便在任何支持 Docker 的环境中运行。了解 Docker 镜像的结构和原理对于有效使用 Docker 至关重要。以下是对 Docker 镜像结构和原理的详细介绍。 Dock…