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

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

排序算法的时间复杂度通常取决于输入数据的规模(通常表示为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为待排序序列的长度。这是因为基数排序需要对每一位进行计数或分配,然后将它们收集起来。

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

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

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

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

相关文章

进程打开文件

目录 一、预备知识 二、操作文件函数 三、操作文件系统调用 四、理解进程打开文件 函数 vs 系统调用 open的返回值 fd 如何理解一切皆文件? 理解struct file 内核对象 fd的分配规则 && 重定向 理解标准错误流(2号文件描述符&#xff0…

得帆助力大族激光主数据平台建设,用数据为企业生产力赋能

本期客户 大族激光科技产业集团股份有限公司(以下简称“大族激光”)是一家从事工业激光加工设备与自动化等配套设备及其关键器件的研发、生产、销售,激光、机器人及自动化技术在智能制造领域的系统解决方案的优质提供商,是国内激光…

如何通过四维轻云SDK开发打造智慧景区管理平台?

智慧景区管理平台通常是基于GIS技术,在三维实景地图的基础上,接入景区各类传感设备、第三方系统数据,进行业务功能的梳理及开发。但对于没有GIS开发经验的团队而言,地图开发具有一定的技术门槛,尤其是需要在前端解决好…

VR全景在智慧园区中的应用

VR全景如今以及广泛的应用于生产制造业、零售、展厅、房产等领域,如今720云VR全景更是在智慧园区的建设中,以其独特的优势,发挥着越来越重要的作用。VR全景作为打造智慧园区的重要角色和呈现方式已经受到了越来越多智慧园区企业的选择和应用。…

记事小本本

记事小本本 实现效果 相关代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</titl…

Zookeeper详解

1.Zookeeper概述 1.Zookeeper概念 Zookeeper是 Apache Hadoop 项目下的一个子项目&#xff0c;是一个树形目录服务 Zookeeper 翻译过来就是动物园管理员&#xff0c;他是用来管 Hadoop&#xff08;大象&#xff09;、Hive(蜜蜂)、Pig(小猪)的管理员。简称zk Hadoop: 存储海…

Java项目:46 ssm005基于SSM框架的购物商城系统+jsp(含文档)

作者主页&#xff1a;源码空间codegym 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 项目是单体ssm电商水果平台&#xff0c;包括前台商城平台及后台管理系统 前台商城系统包含首页门户、商品推荐、商品搜索、商品展示、购物车、…

Buuctf-Web-[极客大挑战 2019]EasySQL 1 题解及思路总结

​ 启动靶机 目录 题要做题过程第一步——找到页面与数据库产生交互的地方第二步——查看SQL语句闭合方式判断SQL注入闭合方式&#xff1a;方法一&#xff1a;使用\(转义字符)来判断SQL注入的闭合方式方法二&#xff1a;输入1、1、1"判断SQL语句闭合方式 第三步——进行SQ…

代理IP如何应对自动化测试和爬虫检测

目录 一、代理IP在自动化测试和爬虫中的作用 二、代理IP的优缺点分析 1.优点 2.缺点 三、应对自动化测试和爬虫检测的策略 1.选择合适的代理IP 2.设置合理的请求频率和间隔 3.模拟人类行为模式 4.结合其他技术手段 四、案例与代码示例 五、总结 在自动化测试和爬虫开…

Alpha突触核蛋白神经退行性疾病介绍

StressMarq——Alpha突触核蛋白&神经退行性疾病 Alpha突触核蛋白科研背景 • Alpha突触核蛋白约 15kDa, 140个氨基酸 • StressMarq/欣博盛生物在E. coli中过表达人源基因然后将蛋白从细胞质基质中纯化出来 • 未折叠的alpha突触核蛋白单体在12% SDS-PAGE上为~15 kDa的条…

CentOS本地部署Tale博客并结合内网穿透实现公网访问本地网站

文章目录 前言1. Tale网站搭建1.1 检查本地环境1.2 部署Tale个人博客系统1.3 启动Tale服务1.4 访问博客地址 2. Linux安装Cpolar内网穿透3. 创建Tale博客公网地址4. 使用公网地址访问Tale 前言 今天给大家带来一款基于 Java 语言的轻量级博客开源项目——Tale&#xff0c;Tale…

2022年吉林省大学生电子设计竞赛(D题)

一. 使用技术 PWM调速&#xff0c;PID&#xff0c;串口通信&#xff0c;陀螺仪测角度&#xff0c;蓝牙 二. 项目描述 大学的第一个比赛&#xff0c;项目采用主控stm32&#xff0c;车体采用一个四路电机驱动来驱动减速电机&#xff0c;小车依靠8路灰度循迹模块&#xff0c;实…

Keepalive+LVS群集部署

引言 Keepalived 是一个基于VRRP协议来实现的LVS服务高可用方案&#xff0c;可以解决静态路由出现的单点故障问题。 一、Keepalive概述 keepalive软件起初是专为 LVS 负载均衡软件设计的&#xff0c;用来管理并监控 LVS集群中各个服务节点的状态&#xff0c;后来又加入了可以…

【VS Code插件开发】自定义指令实现 git 命令 (九)

&#x1f431; 个人主页&#xff1a;不叫猫先生&#xff0c;公众号&#xff1a;前端舵手 &#x1f64b;‍♂️ 作者简介&#xff1a;前端领域优质作者、阿里云专家博主&#xff0c;共同学习共同进步&#xff0c;一起加油呀&#xff01; ✨优质专栏&#xff1a;VS Code插件开发极…

2m高分辨率土地利用分类矢量数据/植被类型分布数据

土地利用数据是在根据影像光谱特征&#xff0c;结合野外实测资料&#xff0c;同时参照有关地理图件&#xff0c;对地物的几何形状&#xff0c;颜色特征、纹理特征和空间分布情况进行分析&#xff0c;建立统一解译标志的基础之上&#xff0c;依据多源卫星遥感信息&#xff0c;结…

<Linux> 线程控制

目录 一、线程资源的分配 &#xff08;一&#xff09;线程私有资源 &#xff08;二&#xff09;线程共享资源 二、原生线程库 三、线程控制接口 &#xff08;一&#xff09;线程创建 - pthread_create() 1. 一个线程 2. 一批线程 &#xff08;二&#xff09;线程等待 …

webpack5零基础入门-2wepack配置项的了解

在使用webpack之前&#xff0c;我们需要对webpack的配置项有一定的认识。 1.五大核心概念 1.entry&#xff08;入口&#xff09; 指示webpack从哪个文件开始打包 2.output (输出) 指示webpack打包完的文件输出到哪里,如何命令等 3.loader(加载器) webpack本身只能处理js…

数字证书在网络安全中的重要性与实际应用

数字证书作为一种“电子身份证”&#xff0c;在当今数字化的商业环境中有着广泛的实际应用。它主要用于身份认证、加密通信、电子签名和安全访问控制等方面&#xff0c;为各行各业提供了安全可靠的数字化解决方案。 网络安全领域 在网络通信中&#xff0c;数字证书被广泛应用…

【脚本玩漆黑】橙华市全自动练级

文章目录 前言项目结构故事后续 前言 选完预三家&#xff0c;作者来到了橙华市。 众所周知啊&#xff0c;打架输了要掏一半的家产&#xff0c;所以宝可梦世界非常的危险。 为了安全考虑&#xff0c;作者打算在这里升个级。 项目结构 1&#xff0c;安装库。 pip install pynp…

Java后端八股------消息中间件篇

自动确认没收到&#xff0c;实现重复消费问题&#xff0c;可以用业务唯一标识来确定业务是否被消费。 TTL也就是超时时间&#xff0c;一般去dead letter的时间为min(消息的ttl,queue的ttl)。 acksall设置是最安全的&#xff0c;但是效率太低了&#xff0c;实际的生…