快速排序效率

news2024/11/25 22:33:01

为了搞清楚快速排序的效率,我们先从分区开始。分解来看,你会发现它包含两种步骤。

❏ 比较:每个值都要与轴做比较。

❏ 交换:在适当时候将左右指针所指的两个值交换位置。

一次分区至少有N次比较,即数组的每个值都要与轴做比较。因为每次分区时,左右指针都会从两端开始靠近,直到相遇。

交换的次数则取决于数据的排列情况。一次分区里,交换最少会有1次,最多会有N / 2次,因为即使所有元素都需要交换,我们也只是将左半部分与右半部分进行交换,如下图所示。

对于随机排列的数据,粗略来算就是N / 2的一半,即N / 4次交换。于是,N次比较加上N / 4次交换,共1.25N步。最后根据大O记法的规则,忽略常数项,得出分区操作的时间为O(N)。

这就是一次分区的效率。但完整的快速排序需要对多个数组以及不同大小的子数组分区,想知道整个过程所花的时间,还要再进一步分析才行。

为了更形象地描述,我们将一个含有8个元素的数组的快速排序过程画了出来。它旁边有每一次分区所作用的元素个数。由于元素值并不重要,因此就不显示了。注意,作用范围就是那些白色的格子。

这里有8次分区,但每次作用的范围大小不一。因为只含1个元素的子数组就是基准情形,无须任何交换和比较,所以只有元素量大于或等于2的子数组才要算分区。

由于此例属于平均情况的一种,因此我们假设每次分区大约要花1.25N步,得出:

如果再对不同大小的数组做统计,你会发现N个元素,就要N×log N步。想体会什么是N×log N的话,可参考下表。

在上面一个数组含8个元素的例子中,快速排序花了大约21步,也很接近8×log8(等于24)​。这种时间复杂度的算法我们还是第一次遇到,用大O记法来表达的话,它是O(N log N)算法。

快速排序的步数接近N×log N绝非偶然。如果我们以更平均的情况来考察快速排序,就能看出原因了。

快速排序开始时会对整个数组进行分区。假设此次分区会将轴最终安放到数组中央——这也是平均情况——然后我们就要对由此切开的两半进行分区。巧合的是,它们的轴也最终落在各自的中央,分出4个大小为原数组四分之一的子数组。并且,接下来所有分区都出现了这种轴在中央的情况。

这样一来,我们基本上就是在不断地对半切分子数组,直至产生出的子数组长度为1。那么,一个数组要经历多少次分区才能切到这么小呢?如果数组元素有N个,那就是log N次。假设元素有8个,那就要对半切3次,才能分出只有1个元素的子数组。这个原理你应该在二分查找那节学过了。对两个新的子数组所执行的分区操作,需要处理的数据量还是相当于对原数组所做的分区。如下图所示。

因为等分发生了log N次,而每次都要对总共N个元素做分区,所以总步数为N×log N。

之前我们看到的很多算法,最佳情况都发生在元素有序的时候。但在快速排序里,最佳情况应该是每次分区后轴都刚好落在子数组的中间。

最坏情况

快速排序最坏的情况就是每次分区都使轴落在数组的开头或结尾。导致这种情况的原因有好几种,包括数组已升序排列,或已降序排列。下面我们把这种情况用图来说明一下。

虽然在此情况下,每次分区都只有一次交换,但比较的次数却变得很多。在轴总落在中央的例子里,每次分区都能划分出比原数组小得多的子数组(过程中产生的最大的子数组长度为4)​,使各部分都能很快地到达基准情形。然而如果轴落在其中一端,前5次分区就需要处理长度大于4的数组。而且这5次分区里,每次所需的比较次数还是和子数组的元素量一样多。

于是在最坏情况下,对8 + 7 + 6 + 5 + 4 + 3 + 2个元素进行分区,一共35次比较。

写成公式的话,就是N个元素,需要N + (N -1) + (N -2) + (N -3) + … + 2步,即$N^{2}$/ 2步,如下图所示。

又因为大O忽略常数,所以最终我们会说,快速排序最坏情况下的效率为O($N^{2}$)。既然把快速排序分析完了,我们将它与插入排序比较一下。

虽然快速排序在最好情况和最坏情况都没能超越插入排序,但在最常遇见的平均情况,前者的O(Nlog N)比后者的O($N^{2}$)好得多,所以总体来说,快速排序优于插入排序。

以下是各种时间复杂度的对比。

由于快速排序在平均情况下表现优异,于是很多编程语言自带的排序函数都采用它来实现。因此一般你不需要自己写快速排序。但你可能需要学会写快速选择——它是一种类似快速排序的实用算法。

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

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

相关文章

打开第四十二天:买卖股票的最佳时机IV、最佳买卖股票时机含冷冻期、买卖股票的最佳时机含手续费

一、买卖股票的最佳时机IV(困难) 题目 文章 视频 这道题目可以说是上一题的进阶版,这里要求至多有k次交易。 确定dp数组以及下标的含义 在上一题中定义了一个二维dp数组,本题其实依然可以用一个二维dp数组。使用二维数组 dp…

wireshark使用介绍及案例分享

一、wireshark介绍 1、定义 wireshark是非常流行的网络封包分析软件,简称小鲨鱼,功能十分强大。可以截取各种网络封包,显示网络封包的详细信息。对应的,linux下的抓包工具是 tcpdump。 1.1、网络基础 参考TCP/IP五层模型,帧结构如下: 帧字段 帧字段含义 Frame 物理层的…

百元蓝牙耳机哪个牌子的比较好?四款百元必入热门机型盘点

一款优秀的蓝牙耳机都能极大提升我们的使用体验,然而,对于大多数消费者而言,高端蓝牙耳机昂贵的价格常常令人望而却步,幸运的是,市场上有很多性价比极高的品牌提供了百元左右的优质选择,那么百元蓝牙耳机哪…

基于STM32开发的智能电能监测系统

目录 引言环境准备工作 硬件准备软件安装与配置系统设计 系统架构硬件连接代码实现 初始化代码控制代码应用场景 家庭电能监测工业用电管理常见问题及解决方案 常见问题解决方案结论 1. 引言 智能电能监测系统通过实时采集电流、电压等电力参数,计算电能消耗&…

FPGA开发——UART串口通信的介绍和回环实验框架构建

一、简介 1、原理 UART(Universal Asynchronous Receiver/Transmitter,通用异步收发器)是一种广泛使用的串行通信协议,特别适用于微控制器、计算机和各种嵌入式设备之间的数据通信。 UART是一种异步串行通信方式,通过…

Prometheus+Grafana-1-基础介绍及安装

一、体系架构(了解) 数据采集流程 说白了就是采集数据->计算是否超过阈值->发起警告 Prometheus查询界面如下 1.报警简介 展现形式:短信,邮件,电话,通讯软件。 阈值(Trigger Value),如达到阈值可以触发预警。…

巨详细的规则引擎 Drools——小白也可食用

巨详细的规则引擎 Drools——小白也可食用 一、问题1.1、传统做法1.2、存在的问题1.3、引入 二、规则引擎概述2.1、什么是规则引擎2.2、使用规则引擎的优势2.3、规则引擎应用场景2.4、Drools介绍 三、Drools入门案例3.1、创建Springboot项目3.2、引入依赖3.3、添加Drools配置类…

鸿蒙(API 12 Beta3版)【投播组件开发指导】分布式媒体会话

通过本开发指导,完成一次音视频跨设备投播。 约束与限制 需同时满足以下条件,才能使用该功能: 设备限制 本端设备:HarmonyOS NEXT Developer Preview0及以上版本的手机设备 远端设备:HarmonyOS NEXT Developer Previ…

动起来!Axure动画的实用技巧

前言 在数字产品的世界中,用户体验的每一个细节都至关重要。 动画,作为一种增强交互性和视觉吸引力的手段,已经成为现代界面设计中不可或缺的元素。 Axure,作为一款强大的原型设计工具,提供了丰富的动画功能&#x…

进程第二部分

1.任务:子进程做的事情和父进程差不多(子承父业) 父进程创建出子进程之后,子进程做的事情与父进程完全不同(自力更生) 2.exec: int exec l(const char *path, const char *arg, ...); int exec v(const c…

python管理mysql

[rootserver1 ~]# pip3 config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple //这是设置清华镜像站,提高下载安装速度,如果报错提示找不到config,这是因为版本低,临时使用清华镜像站来升级 pip&…

愤怒的江小白,这几年怎么了?

近日,东方甄选和江小白的纠纷引发了广泛关注。 8月8日晚间,东方甄选直播间中,主播天权在带货某款白酒产品时突然对比点评江小白产品,称江小白“不是白酒”:“你现在去看江小白的包装,上面是没有‘白酒’这…

1Panel 部署 爱影CMS

前言 本文以 爱影CMS 为例提供了一种在 1Panel 面板中在 docker 内运行二进制程序的一种思路。符合 1Panel 基于容器管理并部署应用,实现最小的漏洞暴露面的思路。 环境准备 完整的 1Panel 环境(1Panel 如何安装? / 1Panel Pro 优惠购)服务…

软件测试学习搭子抱团取暖(已有400+)

希望优秀的测试人都聚齐在一起,大家一起解决面试难题,工作上的问题,在解决问题的同时自己也能提升,同时相互交流分享资料等测试面试经验,一起讨论交流呀。定个小目标2000。

除了知云文献翻译外,这几款翻译工具值得推荐!

近年来,市面上涌现出众多优秀的文献翻译工具,其中知云文献翻译凭借其强大的功能受到了广泛好评。然而,除了知云文献翻译外,还有几款翻译工具同样值得推荐。今天,就让我们一起来了解一下! Foxit在线翻译 链…

【Qt】控件介绍

控件概念 一个图形化界面上的内容,在编写代码的时候不需要全部从零开始实现。Qt种已经提供了很多内置的控件(按钮、文本框、单选按钮、复选按钮、下拉框等等),直接进行使用即可。 控件,英文名称widget,控件…

企业源代码加密软件有哪些?2024最好用的十款源代码加密软件

在当今快速发展的技术环境中,企业源代码的安全性至关重要。源代码不仅包含着企业的核心知识产权,还可能涉及敏感的商业数据。因此,选择一款合适的源代码加密软件,对于保护企业资产和避免数据泄露风险至关重要。随着安全技术的不断…

(回溯) LeetCode 47. 全排列||

原题链接 建议先练习:全排列| 一. 题目描述 给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。 示例 1: 输入:nums [1,1,2] 输出: [[1,1,2],[1,2,1],[2,1,1]]示例 2: 输入&a…

【JavaEE初阶】线程池

目录 📕 引言 🌳 概念 🍀ThreadPoolExecutor 类 🚩 int corePoolSize与int maximumPoolSize: 🚩 long keepAliveTime与TimeUnit nuit: 🚩 BlockingQueue workQueue&#xff1a…

C# 序列化与反序列化指南:将对象数据写入/读取到XML文件

文章目录 1. XML 文件的基本概念以及为何使用 XML 文件进行数据序列化2. C# 中的 XML 文件序列化使用 XmlSerializer 类进行操作的详细步骤3. 创建一个自定义对象并序列化对象数据到 XML 文件的示例代码4. 读取 XML 文件并反序列化(将 XML 数据转换为对象数据&#…