快速排序的背后——深入理解时间复杂度

时间复杂度的概念衡量算法性能的重要标准,是算法设计和性能优化中的关键概念,对于编写高效、稳定和可扩展的程序至关重要。但是,初学者对于如何理解和应用时间复杂度则显得较为困难,本文以快速排序为例进一步加深对时间复杂度的理解。

1 回顾

本文侧重于时间复杂度的计算,关于时间复杂度的概念可参考二分查找——算法基础。
首先,我们回顾一下快速排序:

def quicksort(arr):

    if len(arr) < 2:
        return arr
    else:
    	pivot = arr[0]
    	less = [i for i in arr[1:] if i < pivot]
    	greater = [i for i in arr[1:] if i > pivot]
    	return quicksort(less) + [pivot] + quicksort(greater)

在之前的文章中谈过,大O表示法在表示时间复杂度的时候考虑的是最遭的情况,但是由于快速排序的特殊性,需要特别强调平均情况下的时间复杂度。

1 最遭的情况

当我们每次选定的基准值都是无序列表中的最小或最大值的时候,这个时候该算法的时间复杂度与选择排序无差异为 O ( n 2 ) O_(n^2) O(n2),因为每次进行子集的划分都要对列表内的各个元素操作一次,而像这样的操作要执行n次(调用栈高度为n)。
在这里插入图片描述

2 一般情况

但是,当每次选择到的pivot都是集合中大小居中的元素,这个时候操作的子集数为 l o g 2 n log_{2}n log2n
在这里插入图片描述
而用户给函数提供的列表多是无序的,所以可以以平均情况下的时间复杂度来表示快速排序的性能,即平均下来,调用栈的高度为 l o g 2 n log_{2}n log2n,而每次对站内存储的列表元素都要进行对比,所以操作次数为 n n n,所以时间复杂度为:
O n l o g 2 n → n ⋅ l o g 2 n O_{nlog_{2}n}\to n\cdot log_{2}n Onlog2nnlog2n

END

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

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

相关文章

云服务器ECS_云主机_服务器托管_计算-阿里云

阿里云服务器ECS英文全程Elastic Compute Service&#xff0c;云服务器ECS是一种安全可靠、弹性可伸缩的云计算服务&#xff0c;阿里云提供多种云服务器ECS实例规格&#xff0c;如经济型e实例、通用算力型u1、ECS计算型c7、通用型g7、GPU实例等&#xff0c;阿里云百科aliyunbai…

Logstash配置详解

一、配置文件 Logstash配置文件位于Logstash安装目录下bin/logstash.conf 启动命令: logstash -f logstash.conf文件描述logstash.yml配置Logstash的yml。pipelines.yml包含在单个Logstash实例中运行多个管道的框架和说明。jvm.options配置Logstash的JVM&#xff0c;使用此文…

Unity图片导入趣事随笔

像这样的png格式的图片&#xff0c;直接导入unity时unity会把没有像素的部分用黑色填充&#xff0c;并根据填充部分自动生成alpha通道。看起来alpha通道是不能手动覆盖的&#xff0c;即使在ps中手动添加一个alpha通道&#xff0c;并添加覆盖值。 导出后也会发现这没有任何意义&…

环信服务端下载消息文件---菜鸟教程

前言 在服务端&#xff0c;下载消息文件是一个重要的功能。它允许您从服务器端获取并保存聊天消息、文件等数据&#xff0c;以便在本地进行进一步的处理和分析。本指南将指导您完成环信服务端下载消息文件的步骤。 环信服务端下载消息文件是指在环信服务端上&#xff0c;通过调…

Self-Attention

前置知识&#xff1a;RNN&#xff0c;Attention机制 在一般任务的Encoder-Decoder框架中&#xff0c;输入Source和输出Target内容是不一样的&#xff0c;比如对于英-中机器翻译来说&#xff0c;Source是英文句子&#xff0c;Target是对应的翻译出的中文句子&#xff0c;Attent…

【新特性演示】YOLOv8实现旋转对象检测

学习《OpenCV应用开发&#xff1a;入门、进阶与工程化实践》一书 做真正的OpenCV开发者&#xff0c;从入门到入职&#xff0c;一步到位&#xff01; YOLOv8旋转对象检测 YOLOv8框架在在支持分类、对象检测、实例分割、姿态评估的基础上更近一步&#xff0c;现已经支持旋转对象…

【微信小程序独立开发1】项目提出和框架搭建

前言&#xff1a;之前学习小程序开发时仿照别人的页面自己做了一个商城项目和小说项目&#xff0c;最近突发奇想&#xff0c;想从0开发一个关于《宠物日记》的小程序&#xff0c;需求和页面都由自己设计&#xff0c;将在这记录开发的全部流程和过程中遇到的难题等... 1、搭建小…

AI Table应用程序接口表的格式说明和作用

AI Table 首先全拼不是AI人工智能表&#xff0c;而是Application Interface Table应用程序接口表。此表按照AUTOSAR的格式规范去定义&#xff0c;并且使用此Excel 表格生成相应的应用软件组件Arxml文件。下面就让我们按照AUTOSAR_EXP_AIUserGuide.pdf文档官方解释描述文件去看看…

Camtasia2024屏幕录像和视频编辑软件

做网络教学视频&#xff0c;开发微课程&#xff0c;用得最多的就是录屏视频编辑&#xff0c;而在这类软件中我只推荐Camtasia Studio。随着Camtasia Studio的更新&#xff0c;其功能越来越完善&#xff0c;用户界面越来越友好&#xff0c;除了安装更加简单&#xff0c;汉化只需…

51-10 多模态论文串讲—ALBEF 论文精读

今天我们就来过一下多模态的串讲&#xff0c;其实之前&#xff0c;我们也讲了很多工作了&#xff0c;比如说CLIP&#xff0c;还有ViLT&#xff0c;以及CLIP的那么多后续工作。多模态学习在最近几年真的是异常的火爆&#xff0c;那除了普通的这种多模态学习&#xff0c;比如说视…

管桩生产管理系统 | 任务单自动计算了解一下!

库存、生产、运输科学化管理 采用自主研发的数智控制技术 对管桩生产登记、管桩配料 管桩混凝土分料生产过程进行管理 不仅能管生产 对于成品库存、管桩运输思伟都有 对应系统模块支持科学管理 系统提升管桩量产效率至少 30% 降低人工重复工作量 60% 给您 100% 畅快体验 …

【开源】基于JAVA的固始鹅块销售系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 鹅块类型模块2.3 固始鹅块模块2.4 鹅块订单模块2.5 评论管理模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 鹅块类型表3.2.2 鹅块表3.2.3 鹅块订单表3.2.4 鹅块评论表 四、系统展示五、核心代码5.…

Ansible的切片特性与多机器选取

一、【概述】 本文介绍一下Ansible的多机器选取和切片特性&#xff0c;这个还是一个比较有用的技巧&#xff0c;可以快速选取仓库中我们需要的机器清单。 因为该特性可能与其他工具语法稍微有些不一样&#xff0c;时间长了会忘&#xff0c;值得记录一下 二、【具体说明】 1…

【Maven】005-基于 IDEA 进行 Maven 依赖管理

【Maven】005-基于 IDEA 进行 Maven 依赖管理 文章目录 【Maven】005-基于 IDEA 进行 Maven 依赖管理一、Maven 依赖管理二、GAVP 再说明三、Maven 工程依赖管理配置1、依赖配置2、版本统一声明和使用3、依赖范围说明4、Maven工程依赖下载失败错误解决&#xff08;重点&#xf…

行为驱动测试 python + behave

行为驱动&#xff0c;Behave-Driven Development&#xff0c;简称BDD。在行为驱动中运用结构化的自然语言描述场景测试&#xff0c;然后将这些结构化的自然语言转化为可执行的测试脚本或者其他形式。BDD的一种优势是&#xff0c;它建立了一种通用语言&#xff0c;而这种语言可以…

【Java SE语法篇】5.方法

&#x1f4da;博客主页&#xff1a;爱敲代码的小杨. ✨专栏&#xff1a;《Java SE语法》 ❤️感谢大家点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;&#xff0c;您的三连就是我持续更新的动力❤️ 文章目录 0. 前言1. 方法的概念和使用1.1 什么是方法1.2 方法…

Android开发基础(二)

Android开发基础&#xff08;二&#xff09; 上篇主要描述了Android系统架构&#xff0c;代码是通过Java表示的&#xff1b; 本篇将从介绍Android组件去理解Android开发&#xff0c;代码将对Java和Kotlin进行对比。 Android组件 Android应用程序由一些零散的有联系的组件组成…

SQL Server的彻底卸载的方式

这篇文章主要介绍了SQL Server的彻底卸载的方式&#xff0c;具有很好的参考价值&#xff0c;希望对大家有所帮助。如有错误或未考虑完全的地方&#xff0c;望不吝赐教 SQL Server的彻底卸载与再次安装 可能大家已经有深刻体会&#xff0c;SQL Server的卸载十分繁琐。最让人头…

时间序列数据库选型: influxdb; netdiscover列出docker实例们的ip,docker管理工具lazydocker、scope

influxdb influxdb: 有收费版本、有开源版本 influxdb 安装、启动(docker) docker run -itd --name influxdb-dev -p 8086:8086 influxdb #influxdb的web客户端(端口8003)被去掉了 #8006是web-service端口#docker exec -it influxdb-dev bashinfluxdb 自带web界面 从后面的…

3年测试经验,用例设计竟然不知道状态迁移法?

3年测试经验&#xff0c;用例设计竟然不知道状态迁移法&#xff1f; 1、概念 状态迁移法主要关注在测试状态转移的正确性上面。对于一个有限状态机&#xff0c;通过测试验证其在给定的条件内是否能够产生需要的状态变化&#xff0c;有没有不可达的状态和非法的状态&#xff0c…