常见的排序算法的时间复杂度

news2024/11/25 20:36:51

常见的排序算法的时间复杂度

排序算法的时间复杂度通常取决于输入数据的规模(通常表示为n)。以下是一些常见排序算法及其平均、最好和最坏情况下的时间复杂度:

1、冒泡排序(Bubble Sort)
  • 平均时间复杂度:O(n^2)

  • 最好情况时间复杂度:O(n)

  • 最坏情况时间复杂度:O(n^2)

冒泡排序通过重复地遍历待排序序列,比较相邻元素的大小并交换它们的位置,直到没有元素需要交换为止。

在最坏情况下,即序列完全逆序时,冒泡排序需要进行n-1轮比较,每轮比较都需要遍历整个序列。因此,时间复杂度为O(n^2)。

在最好情况下,即序列已经有序时,冒泡排序只需要进行一轮比较,时间复杂度为O(n)。

平均情况下,冒泡排序的时间复杂度也是O(n^2)。

2、选择排序(Selection Sort)
  • 平均时间复杂度:O(n^2)

  • 最好情况时间复杂度:O(n^2)

  • 最坏情况时间复杂度:O(n^2)

选择排序在每一轮迭代中选择剩余元素中的最小(或最大)元素,并将其放到序列的起始位置。

选择排序的时间复杂度与输入序列的顺序无关,因为每轮迭代都需要遍历剩余元素以找到最小(或最大)元素。因此,无论最好、最坏还是平均情况,选择排序的时间复杂度都是O(n^2)。

3、插入排序(Insertion Sort)
  • 平均时间复杂度:O(n^2)
  • 最好情况时间复杂度:O(n)
  • 最坏情况时间复杂度:O(n^2)

插入排序通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。

在最坏情况下,即序列完全逆序时,每次插入都需要将已排序的元素逐个向后移动,时间复杂度为O(n^2)。

在最好情况下,即序列已经有序时,插入排序只需要遍历一次序列即可完成,时间复杂度为O(n)。

平均情况下,插入排序的时间复杂度也是O(n^2),但通常比冒泡排序和选择排序稍快一些。

4、希尔排序(Shell Sort)
  • 平均时间复杂度:O(n log n) 到 O(n^2),取决于增量序列的选择
  • 最好情况时间复杂度:O(n log n)
  • 最坏情况时间复杂度:O(n^2)

希尔排序,也称递减增量排序算法,是插入排序的一种更高效的改进版本。希尔排序是非稳定排序算法。

该算法由希尔(Donald Shell)于1959年提出,基本思想是:先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行依次直接插入排序。

具体算法步骤为:

  1. 选择一个增量序列t1,t2,…,tk,其中ti>tj,tk=1。
  2. 按增量序列个数k,对序列进行k趟排序。
  3. 每趟排序,根据对应的增量ti,将待排序列分割成若干长度为m的子序列,分别对各子表进行直接插入排序。

希尔排序的时间复杂度与增量序列的选择有关,但通常情况下,希尔排序的时间复杂度较直接插入排序、冒泡排序、选择排序等方法有较大改进。在实际应用中,希尔排序是一种性能较好的排序算法。

5、归并排序(Merge Sort)
  • 平均时间复杂度:O(n log n)
  • 最好情况时间复杂度:O(n log n)
  • 最坏情况时间复杂度:O(n log n)

归并排序采用分治策略,将序列递归地分成两半,直到子序列长度为1(认为已有序),然后将有序子序列合并成一个有序序列。

归并排序的时间复杂度与输入序列的顺序无关,总是为O(n log n)。这是因为它将问题划分为两个大致相等的子问题,并将它们递归地解决,然后将结果合并。

6、快速排序(Quick Sort)
  • 平均时间复杂度:O(n log n)
  • 最好情况时间复杂度:O(n log n)
  • 最坏情况时间复杂度:O(n^2)(当输入数据已经排序或逆序时)

https://img-blog.csdnimg.cn/20200209124339136.gif

快速排序是一种高效的排序算法,它采用分治策略。通过选择一个基准元素,将序列划分为左右两部分,左边部分小于基准,右边部分大于基准,然后递归地对左右两部分进行排序。

在最好情况下,即每次划分都能将序列均匀分为两部分时,快速排序的时间复杂度为O(n log n)。

在最坏情况下,即输入序列已经有序或逆序时,快速排序退化为O(n^2)。

平均情况下,快速排序的时间复杂度为O(n log n),但由于划分的不均匀性,实际性能可能有所波动。

7、堆排序(Heap Sort)
  • 平均时间复杂度:O(n log n)
  • 最好情况时间复杂度:O(n log n)
  • 最坏情况时间复杂度:O(n log n)

https://img-blog.csdnimg.cn/20210314130304416.gif#pic_center

堆排序利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子节点的键值或索引总是小于(或者大于)它的父节点。

堆排序包括两个主要阶段:建堆和堆调整排序。建堆的时间复杂度为O(n),堆调整排序的时间复杂度为O(nlogn),因此总的时间复杂度为O(nlogn)。

8、计数排序(Counting Sort)
  • 时间复杂度:O(n + k),其中k是整数的范围

计数排序(Counting Sort)是一种线性时间复杂度的排序算法,它的基本思想是将输入的数据值转化为键存储在额外开辟的数组空间中。计数排序不是基于比较的排序算法,其优势在于在对一定范围内的整数排序时,复杂度为O(n+k),其中n为输入元素个数,k为待排序列中最大的数。这使得计数排序快于任何比较排序算法。

计数排序要求输入的数据必须是有确定范围的整数。排序过程大致如下:

  1. 找出待排序数组中的最大和最小元素。
  2. 统计数组中每个值为i的元素出现的次数,存入数组count的第i项。
  3. 对所有的计数进行累加(从count中的第一个元素开始,每一项和前一项相加),为了直接求得元素的位置。
  4. 反向填充目标数组:将每个元素i放在新数组的第count[i]项,每放一个元素就将count[i]减去1。

需要注意的是,计数排序的空间复杂度为O(k),其中k为待排序列中最大的数。这意味着如果数据的范围很大,计数排序可能需要消耗大量的内存。因此,计数排序更适合于数据范围较小的情况,如排序0到100之间的数字。对于数据范围很大的数组或者非整数数据,计数排序可能不是最佳选择。

9、桶排序(Bucket Sort)
  • 时间复杂度:取决于数据分布和桶的数量,通常在O(n + n2/k)到O(n2)之间,其中k是桶的数量

桶排序(Bucket Sort)是一种分配式排序算法,它的工作原理是将数组分到有限数量的桶子里。每个桶子再个别排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序),最后依次把各个桶中的记录列出来以得到有序序列。

桶排序的假设是:待排序的一组数均匀独立地分布在一个范围中,并将这一范围划分成几个子范围(即桶)。然后基于某种映射函数,将待排序列的关键字映射到第i个桶中(即桶数组B的下标i),那么该关键字就作为B[i]中的元素(每个桶B[i]都是一组大小为N/M的序列)。接着,对每个桶中的元素进行排序(有可能再使用别的排序算法或是以递归方式继续使用桶排序进行排序),最后依次将各个桶中的元素取出,得到的就是有序序列。

桶排序的时间复杂度依赖于数据的分布和桶的数量。当数据均匀分布时,桶排序使用线性时间(Θ(n))。然而,如果数据分布不均匀,或者桶的数量选择不当,桶排序的性能可能会下降。此外,桶排序并不是比较排序,因此它不受O(n log n)下限的影响。

需要注意的是,桶排序在实际应用中可能受到一些限制。例如,如果数据的范围非常大,或者数据的分布极不均匀,那么可能需要大量的桶,这可能导致空间复杂度的增加。此外,桶排序还需要额外的空间来存储桶和桶中的元素,因此可能不适合内存有限的环境。

10、基数排序(Radix Sort)
  • 时间复杂度:O(d(n + k)),其中d是数字的位数,k是整数的范围

基数排序是按照低位先排序,然后收集;再按照高位排序,然后再收集;依次类推,直到最高位。有时候有些属性是有优先级顺序的,先按低优先级排序,再按高优先级排序。最后的次序就是高优先级高的在前,高优先级相同的低优先级高的在前。

基数排序的时间复杂度是线性的,为O(dn),其中d为数字的位数,n为待排序序列的长度。这是因为基数排序需要对每一位进行计数或分配,然后将它们收集起来。

需要注意的是,这些时间复杂度是理论上的,实际性能可能受到多种因素的影响,包括输入数据的特性、计算机系统的特性以及算法的具体实现方式。此外,对于某些特定的应用场景,可能还需要考虑空间复杂度等其他因素。

先赞后看,养成习惯!!!^ _ ^ ❤️ ❤️ ❤️
码字不易,大家的支持就是我的坚持下去的动力。点赞后不要忘了关注我哦!

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

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

相关文章

使用reprepro+nginx搭建apt服务器

目录 项目背景 项目要求 项目开发过程 1、apt服务器的搭建 2、实现自定义指定源文件列表来实现apt update更新 3、实现软件启动时自动更新 4. source.list中镜像源地址的格式 项目开发的难点/坑点 总结 项目背景 前面写过一篇“利用Nginx搭建一个apt服务器”&#xff…

FreeRTOS学习笔记-基于stm32(5)列表和列表项

一、列表与列表项简介 列表是FreeRTOS中的一种数据结构,类似双向循环链表。用来跟踪FreeRTOS中的任务。列表项就是存放在列表中的项目。 二、列表 列表结构体: typedef struct xLIST {listFIRST_LIST_INTEGRITY_CHECK_VALUE //校验值c…

闲聊电脑(7)常见故障排查

闲聊电脑(7)常见故障排查 夜深人静,万籁俱寂,老郭趴在电脑桌上打盹,桌子上的小黄鸭和桌子旁的冰箱又开始窃窃私语…… 小黄鸭:冰箱大哥,平时遇到电脑故障该咋处理呢? 冰箱&#xf…

vscode使用svn

网上这种文章很多,但很多都实现不了,自己亲测安装有效的过程记录下来,分享给大家。 第一步:去官网下载svn.安装TortoiseSVN 下载地址 下载的地址: Apache Subversion Binary Packageshttps://subversion.apache.or…

55. 跳跃游戏(力扣LeetCode)

文章目录 55. 跳跃游戏贪心每一次都更新最大的步数 取最大跳跃步数(取最大覆盖范围) 55. 跳跃游戏 给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后…

信号处理--基于Fisher分数的通道选择的多通道脑电信号情绪识别

目录 背景 亮点 环境配置 数据 方法 结果 代码获取 参考文献 背景 基于脑电的情绪分析,目前是当前研究的一个主要方向和热点。 亮点 使用基于Fisher score的标准来筛选具有高判别意义的脑电通道; 使用基于特征选择的遗传算法实现特征的筛选,从…

vue项目:webpack打包优化实践

本文目录 一、项目基本信息二、分析当前项目情况1、使用 webpack-bundle-analyzer 插件2、使用 speed-measure-webpack-plugin 插件 三、解决构建问题1、caniuse-lite 提示的问题2、 warning 问题 四、打包速度优化1、修改source map2、处理 loader 五、webpack性能优化1、使用…

SPI机制详解

SPI机制详解 什么是SPI机制? SPI:Service Provider Interface,中文直译:服务提供者接口,它通过在ClassPath路径下的META-INF/service文件夹中查找文件,并自动加载文件里所定义的类 在面向对象的设计原则…

Linux中文件的权限

我们首先需要明白,权限 用户角色 文件的权限属性 一、拥有者、所属组和other(用户角色) 以文件file1为例 第一个箭头所指处即是文件的拥有者,拥有者为zz 第二个箭头所指处即使文件的所属组,所属组为zz 除去拥有者…

利用高分五号02星高光谱数据进行地物识别

高分五号02星搭载了一台60公里幅宽、330谱段、30米分辨率的可见短波红外高光谱相机(AHSI),可见近红外(400~1000nm)和短波红外光谱(1000~2500nm)分辨率分别达到5纳米和10纳米。单看参数性能优越&…

spring boot使用mybatisplus访问mysql的配置流程

网上教程大多教人新建一个带对应组件的项目,本文记录如何在一个已有springboot2.x项目中,配置使用mybatisplus来访问mysql。包括使用wrapper和自己写mapper.xml的自定义函数两种和数据库交互的方式。 关于项目的创建,参考创建springboot 2.x…

PFMEA的输入输出和特殊特性

DFMEA輸入:技术条件、市场需求 DFMEA輸出:产品特殊特性、试验、样件CPPFMEA輸入:过往经验、流程图、DPMEA PFMEA輸出:CP、过程特殊特性、SIP、SOP1. PFMEA的输入包括:()过程流程图、DFMEA 、图样…

基于springboot+vue的线上教育系统(源码+论文)

目录 前言 一、功能设计 二、功能实现 三、库表设计 四、论文 前言 现在大家的生活方式正在被计算机的发展慢慢改变着,学习方式也逐渐由书本走向荧幕,我认为这并不是不能避免的,但说实话,现在的生活方式与以往相比有太大的改变,人们的娱乐方式不仅仅…

P4513 小白逛公园 习题笔记(线段树维护区间最大连续子段和)

传送门https://www.luogu.com.cn/problem/P4513本文参考了董晓老师的博客 这道题着实想了很长时间(新手),只能想到一个O(mn)的dp普通写法,那么遇上区间修改问题改怎么操作呢。答案很明显,线段树…

微服务day01 -- SpringCloud01 -- (Eureka , Ribbon , Nacos)

介绍微服务 1.认识微服务(p1-p5) 随着互联网行业的发展,对服务的要求也越来越高,服务架构也从单体架构逐渐演变为现在流行的微服务架构。这些架构之间有怎样的差别呢? 1.0.学习目标 了解微服务架构的优缺点 1.1.单体架构 单体架构&#…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的稻田虫害检测系统详解(深度学习+Python代码+UI界面+训练数据集)

摘要:本篇文章深入探讨了如何利用深度学习技术开发一个用于检测稻田虫害的系统,并且分享了完整的实现过程和资源代码下载。该系统采用了当前的YOLOv8、YOLOv7、YOLOv6、YOLOv5算法,对其进行了性能对比,包括mAP、F1 Score等关键指标…

redis中通用命令以及key过期策略

通用命令 exists 判断某个key是否存在。 exists key时间复杂度:O(1) 返回值:key 存在的个数。 del 删除指定的 key,可以一次删除一个或者多个。 del key时间复杂度:O(1) 返回值:删除掉的 key 的个数。 expire…

根据索引策略对elasticsearch中的索引进行管理(附带图文教程)

前言 这是我在这个网站整理的笔记,有错误的地方请指出,关注我,接下来还会持续更新。 作者:神的孩子都在歌唱 一. 索引生命周期简介 想要了解更多可以看 : 索引生命周期 1.1 索引生命周期五种阶段 (1)Hot…

C++开发基础——类模板

一,基础定义 类模板是用来生成类的蓝图,是一种创建类的方式,同一套类模板可以生成很多种不同的类。 编译器基于类模板生成的每个类被称为类模板的实例。 第一次使用模板类型声明变量时,会创建类模板的一个实例, 以后…

YOLOv5改进 | 注意力篇 | 利用YOLO-Face提出的SEAM注意力机制优化物体遮挡检测(附代码 + 修改教程)

一、本文介绍 本文给大家带来的改进机制是由YOLO-Face提出能够改善物体遮挡检测的注意力机制SEAM,SEAM(Spatially Enhanced Attention Module)注意力网络模块旨在补偿被遮挡面部的响应损失,通过增强未遮挡面部的响应来实现这一目…