如何衡量一个排序算法的性能

这是八股文的知识,但是中国人又个好的习惯,当别人给你一块好吃的面包时,你总想知道这个面包是怎么做的,对于目前的IT行业来说,不管这个做法你是被动的学习还是主动的探索,你都要知道,也必须要知道。

高端的面试,往往不会直接让你写代码(我经历过一个面试,要求纸上写一个图的数据结构,这可能和我简历中的一条利用图的特性优化启动速度有关,但是一般情况下,我认为这个思想重于实践,并且实践的复杂程度纸上是写不出来的),有经验的面试官会给你算法,但是重点是考虑你的思路和对模式算法套路的理解,即应用。

比如说,面试会要求说一下什么是冒泡排序,或者快速排序,并讲一下快速排序的大概过程。 为什么是这两个呢?因为二者在不同时间复杂度中都具有代表性,不知道时间复杂度怎么分析的,可以看一下 算法-时间复杂度分析

再比如,同样是O(n^2)的时间复杂度,为什么推荐使用插入排序而不推荐冒牌排序?这个问题则主要考查分析能力。

凡此种种,都逃离不了对上面“做法”的扩展。

之前在拥有思想,你就是高级、资深、专家、架构师 中提到过,要提升编程思想,数据结构和算法是必不可少的环节,而今天我发现,掌握分析算法的一些分析能力更加重要,这就好比知道了怎么做面包,还会担心没有面包吗?

那如何分析一个排序算法呢

算法内存消耗

也就是常说的空间复杂度,在排序算法中既有原地排序,也有创建辅助空间排序的,比如冒泡、插入等都是原地排序的,原地排序是什么呢?原地排序指空间复杂度是O(1)的排序算法。

这个指标怎么是分析一个算法的影响因素呢? 比如相同时间复杂度的空间复杂度越小则应是我们选择的标准。

在这之前,必须要明白的一点就是算法的性能除了算法本身实现之外,都是时间和空间的转换来平衡的。

排序算法的执行效率

执行的效率一般讲,以下几点

  • 时间复杂度(最好时间复杂度、最坏时间复杂度、平均时间复杂度)

为什么要区分这三种时间复杂度呢?

  1. 有些排序算法会区分,为了好对比,所以我们最好都做一下区分。
  2. 对于要排序的数据,有的接近有序,有的完全无序。有序度不同的数据,对于排序的执行时间肯定是有影响的,我们要知道排序算法在不同数据下的性能表现
  • 时间复杂度的系数、常数 、低阶

时间复杂度反映的是数据规模 n 很大的时候的一个增长趋势,所以它表示的时候会忽略系数、常数、低阶。但是实际的软件开发中,我们排序的可能是 10 个、100 个、1000 个这样规模很小的数据,所以,在对同一阶时间复杂度的排序算法性能对比的时候,我们就要把系数、常数、低阶也考虑进来。这其实是开发中比较重要的知识点,分析算法的时候常以n做目标,实际开发中则不然。

  • 比较次数和交换(或移动)次数

基于比较的排序算法的执行过程,会涉及两种操作,一种是元素比较大小,另一种是元素交换或移动,这些操作都是需要考虑进去的

算法的稳定性

在排序算法中尤为明显,如果待排序的序列中存在值相等的元素,经过排序之后,相等元素之间原有的先后顺序不变,我们就可以说他是稳定的。反之则是不稳定的

稳不稳定又有什么关系呢?

学习排序算法的时候,都是用整数来举例,但在真正软件开发中,我们要排序的往往不是单纯的整数,而是一组对象,我们需要按照对象的某个 key 来排序

比如说,我们现在要给电商交易系统中的“订单”排序。订单有两个属性,一个是下单时间,另一个是订单金额。如果我们现在有 10 万条订单数据,我们希望按照金额从小到大对订单数据排序。对于金额相同的订单,我们希望按照下单时间从早到晚有序。对于这样一个排序需求,我们怎么来做呢?

最先想到的方法是:我们先按照金额对订单数据进行排序,然后,再遍历排序之后的订单数据,对于每个金额相同的小区间再按照下单时间排序。这种排序思路理解起来不难,但是实现起来会很复杂。

借助稳定排序算法,这个问题可以非常简洁地解决。解决思路是这样的:我们先按照下单时间给订单排序,注意是按照下单时间,不是金额。排序完成之后,我们用稳定排序算法,按照订单金额重新排序。两遍排序之后,我们得到的订单数据就是按照金额从小到大排序,金额相同的订单按照下单时间从早到晚排序的。为什么呢?

稳定排序算法可以保持金额相同的两个对象,在排序之后的前后顺序不变。第一次排序之后,所有的订单按照下单时间从早到晚有序了。在第二次排序中,我们用的是稳定的排序算法,所以经过第二次排序之后,相同金额的订单仍然保持下单时间从早到晚有序。

image.png

ok ,了解答这些分析方法之后,就可以分析算法了,下面是常见的排序算法的各种分析:

image.png

这个表中的时间复杂度一栏,很明显最后三个排序的时间复杂度更优,但是他们并不是我们常见的排序,接下来分析一下这些特殊的算法,看看以后有没有特殊的场景能使用它。

参考

排序算法及其时间复杂度

数据结构与算法之美

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

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

相关文章

如何解决vscode中文路径的问题

首先我们进入设备 搜索“区域”,选择“区域设置” 点击管理语言设置 点击更改系统区域设置,勾选“Beta 版: 使用 Unicode UTF-8 提供全球语言支持(U)”,电脑会叫你重启,你重启就行了

Node.js(四)-express

1. 初识express 1.1 express简介 1.1.1 什么是express 官方:Express是基于Node.js平台,快速、开放、极简的web开发框架。 通俗:Express的作用和Node.js内置的http模块类似,是专门用来创建web服务器的。 express的本质&#xff1…

代码随想录刷题第四十二天| 01背包问题,你该了解这些! ● 01背包问题,你该了解这些! 滚动数组 ● 416. 分割等和子集

代码随想录刷题第四十二天 今天是0-1背包问题,掌握了套路就不难了~~~ 0-1背包问题理论基础(二维数组篇)卡码网第46题 题目思路: 代码实现: input_line input() # 读取一行输入 mn input_line.split() m, n int…

静态关键字:static

static的作用 static是静态的意思,可以修饰成员变量和成员方法。 static修饰成员变量表示该成员变量只在内存中只存储一份,可以被共享访问、修改。 成员变量 分为2类 静态成员变量(有static修饰,属于类,内存中加载…

通用web自动扩缩容_智能运维引擎CudgX

一、概述 CudgX是星汉未来自主研发的面向云原生时代的智能运维引擎,支持根据 MetricQPS 分段耗时指标进行自动扩缩容。 通过各类服务的多维度、大规模的日志数据采集以及机器学习训练分析,对服务进行数字化、指标化度量,并基于部署的…

【Java】设计模式之顺序控制

实际开发中,有时候一些场景需求让多个线程按照固定的顺序依次执行。这个时候就会使用这种模式。 这种模式说白了,就是给线程设定不同的条件,不符合条件的话,就算线程拿到锁也会释放锁进入等待;符合条件才让线程拿到锁…

重生奇迹mu中的智力妹妹都能召唤出哪些宠物呢?

身为重生奇迹mu中的智力妹妹,其实是女性玩家最爱的一种职业,因为她是一种辅助职业,不需要直接参与到战役之中,只需躲藏在队友身后,提供各种BUFF的支援,就能充分发挥其作用,而且身为团队中的唯一…

Redis Geo:掌握地理空间数据的艺术

欢迎来到我的博客,代码的世界里,每一行都是一个故事 Redis Geo:掌握地理空间数据的艺术 前言Redis Geo基本概念Geo模块的目的工作原理地理坐标系统 GEO的分值1. 经纬度范围2. 二分编码3. Base32编码4. 精度为什么使用Geohash? GEO…

Axure RP Extension For Chrome 插件安装

1. 下载好 AXURE RP EXTENSION For Chrome 插件之后解压成文件夹 2. 打开浏览器,找到设置--更多工具--扩展程序--加载已加压的扩展程序,选择解压好的文件夹 3. 点击详细信息,打开访问网址权限

I.MX6ULL_Linux_驱动篇(52)linux CAN驱动

CAN 是目前应用非常广泛的现场总线之一,主要应用于汽车电子和工业领域,尤其是汽车领域,汽车上大量的传感器与模块都是通过 CAN 总线连接起来的。 CAN 总线目前是自动化领域发展的热点技术之一,由于其高可靠性, CAN 总线…

【性能测试】JMeter分布式测试及其详细步骤

性能测试概要 性能测试是软件测试中的一种,它可以衡量系统的稳定性、扩展性、可靠性、速度和资源使用。它可以发现性能瓶颈,确保能满足业务需求。很多系统都需要做性能测试,如Web应用、数据库和操作系统等。 性能测试种类非常多&#xff0c…

< Linux >缓冲区

在上一篇文件的重定向,通常会涉及文件描述符的操控。文件描述符1(fd 1)通常代表着标准输出(stdout),它默认是指向用户的终端或控制台。当执行文件重定向操作时,如果我们关闭文件描述符1&#xf…

AUTOSAR Builder—符合AUTOSAR(CPAP)的嵌入式系统设计工具

产品概述 AUTOSAR Builder是达索旗下一款基于Eclipse并使用Artop的可扩展工具套件。Artop是由AUTOSAR成员和合作伙伴共同推动的开放的AUTOSAR工具环境。它使用户能够构建自己的工具并与其他工具供应商进行集成。AUTOSAR Builder在此基础上新增了多个工具套件,更加能…

华为HarmonyOS 创建第一个鸿蒙应用 运行Hello World

使用DevEco Studio创建第一个项目 Hello World 1.创建项目 创建第一个项目,命名为HelloWorld,点击Finish 选择Empty Ability模板,点击Next Hello World 项目已经成功创建,接来下看看效果 2.预览 Hello World 点击右侧的预…

INT201 形式语言与自动机笔记(下)

L6 Context-Free Languages 上下文无关语言 Context-Free Grammar (CFG) 是一组用于生成字符串模式的递归规则。上下文无关的语法可以描述所有的常规语言,但它们不能描述所有可能的语言。 e.g 遵循这些规则,我们可以生成一种语言: 上下文无关文法 Co…

热钱涌向线控底盘!XYZ全栈集成引领新风向

在车身、底盘部分,中央计算区域控制带动传统车控、底盘及动力控制ECU市场迎来新一轮技术升级和域融合窗口期。线控制动、转向及空气悬架,正在加速与智能驾驶融合并进一步提升驾乘体验。 12月13-15日,2023(第七届)高工…

树莓派3B+ /+ CSI摄像头 + FFmpeg + SRS 实现直播推流

简介: 手头有一个树莓派3B 和一块CSI摄像头,想要实现一个推拉流直播的效果。 所需材料:开发板(我用的是树莓派3B)、CIS摄像头、云服务器(用来搭建SRS服务器) 具体实现思路: 使用…

[排序算法] 如何解决快速排序特殊情况效率低的问题------三路划分

前言 在[C/C]排序算法 快速排序 (递归与非递归)一文中,对于快速排序的单趟排序一共讲了三种方法: hoare、挖坑法、双指针法 ,这三种方法实现的快速排序虽然在一般情况下效率很高,但是如果待排序数据存在大量重复数据,那这几种方法的效率就很低,而为了解决快速排序在这样特殊情况…

XCode Build报错

XCode Build时报以下错误 B/BL out of range 143266484 (max /-128MB) 错误提示表明生成的机器代码太大,超出了限制 需要在XCode工程中添加宏定义,使得生成的可执行文件超过限制 步骤: 在项目设置页面中,选择 “Build Settings…

labelme的安装

首先尝试在(openmmlab)的python3.8的环境下安装(失败)。应该是我环境其他部分不对,和python版本应该没什么关系。(后续,创建新的环境后成功,可直接看最后一部分。) 首先安装是没问题的 pip in…