algotithm -- 排序算法

news2025/1/13 17:47:56

排序算法总结表:
在这里插入图片描述
在这里插入图片描述

1. In-place 和 Out-place 含义

参考链接

  • in-place 占用常数内存,不占用额外内存
    假如问题规模是n,在解决问题过程中,只开辟了常数量的空间,与n无关,这是原址操作,就是In-place。
    例 :
    在冒泡排序中,为了将arr排序,借用了一个temp的临时变量,开辟了一个临时空间,这个空间是常数量,这就是in-place。
  • out-place 占用额外内存
    如果开辟的辅助空间与问题规模有关,则是out-place。
    假设你排序时把数组中的数按顺序放入了一个新的数组,我就开了一个n规模大小的数组,这个就与数据规模有关。

2. 稳定 / 不稳定区别 及 意义

2.1 稳定性的定义

假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,ri = rj,且 ri 在 rj 之前,而在排序后的序列中,ri 仍在 rj 之前,则称这种排序算法是稳定的;否则称为不稳定的。

2.2 需要考虑稳定性的场景举例

排序算法的「稳定性」有何意义?这个还是要分应用场景来看,很多使用情况下,并没有什么实质的意义,而在有些情况下却有很重要的意义。

如放在大数据云计算的条件下它的稳定性非常重要。

  • 举个例子来说,对淘宝网的商品进行排序,按照销量,价格等条件进行排序,它的数据服务器中的数据非常多,因此,当时用一个稳定性效果不好的排序算法,如堆排序、shell 排序,当遇到最坏情形,会使得排序的效果非常差,严重影响服务器的性能,影响到用户的体验。

3. 时间复杂度

3.1 时间复杂度相关概念

3.1.1 了解什么是对数 logN

参考链接 – 对数,指数,logN

在最简单的层面,对数解答以下问题:

多少个既定的数相乘会等于另一个数?

	例子:多少个 2 相乘会等于 8?

	正常答案:2 × 2 × 2 = 8,所以需要把 32 相乘来得到 8
	对数答案:对数是 3
			即 我们这样写"3个2相乘的积为8"log2(8) = 3

3.1.2 归并排序的时间复杂度 nlogn 是如何推导的

参考链接 – 快速排序和归并排序的时间复杂度分析

假设我们需要对一个包含 n 个数的序列使用归并排序,并且使用的是递归的实现方式,那么过程如下:

递归的第 1 层,将n个数划分为 2 个子区间,每个子区间的数字个数为 n/2;
递归的第 2 层,将n个数划分为 4 个子区间,每个子区间的数字个数为 n/4;
递归的第 3 层,将n个数划分为 8 个子区间,每个子区间的数字个数为 n/8;
  ......
递归的第logn层,将n个数划分为 n 个子区间,每个子区间的数字个数为 1- 解释这里为什么是 logn 层(我是菜鸡,我刚开始就不理解):
		假设 最后一层为第 h 层:
		已知第 3 层, 将 n 个数划分为 8 个子区间。3 = log8 
		故 h = logn

我们知道,归并排序的过程中,需要对当前区间进行对半划分,直到区间的长度为 1。也就是说,每一层的子区间,长度都是上一层的 1/2。这也就意味着,当划分到第 logn 层的时候,子区间的长度就是 1 了。而归并排序的 merge 操作,则是从最底层开始(子区间为 1 的层),对相邻的两个子区间进行合并,过程如下:

在第 logn 层(最底层),每个子区间的长度为 1,共 n 个子区间,每相邻两个子区间进行合并,总共合并 n/2 次。n 个数字都会被遍历一次,所有这一层的总时间复杂度为 O(n);
  ......

在第二层,每个子区间长度为 n/4,总共有 4 个子区间,每相邻两个子区间进行合并,总共合并 2 次。n 个数字都会被遍历一次,所以这一层的总时间复杂度为  O(n);
在第一层,每个子区间长度为 n/2,总共有 2 个子区间,只需要合并一次。n 个数字都会被遍历一次,所以这一层的总时间复杂度为 O(n)

通过上面的过程我们可以发现,对于每一层来说,在合并所有子区间的过程中,n 个元素都会被操作一次,所以每一层的时间复杂度都是 O(n)。而之前我们说过,归并排序划分子区间,将子区间划分为只剩 1 个元素,需要划分logn次。每一层的时间复杂度为 O(n),共有 logn 层,所以归并排序的时间复杂度就是 O(nlogn)。

3.2 时间复杂度排序

执行次数函数举例非正式术语
12O(1)常数阶
2n+3O(n)线性阶
3n2+2n+1O(n2)平方阶
5log2n+20O(logn)对数阶
2n+3nlog2n+19O(nlogn)nlogn阶
6n3+2n2+3n+4O(n3)立方阶
2nO(2n)指数阶

注意,经常将 log2n(以2为底的对数)简写成 logn

O(1) < O(logn) < O(n) < O(nlogn) < O(n2) < O(n3) < O(2n) < O(n!) < O(nn) 										

在这里插入图片描述

例:
实现相同目的的两个算法时间复杂度为:
算法1:O1(n) = n 
算法2:O2(n) = logn
若 n = 4;
故时间复杂度 O1(n) = 4  >  O2(n) = log4 = log2^4 = 2,故 O2 更优。

4. 排序算法示例

参考链接–菜鸟教程

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

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

相关文章

谷歌浏览器通过network模拟HTTP中的GET/POST请求获取response

1、F12打开network选中需要模拟的方法Copy->Copy as fetch 2、通过AI帮你进行转换一下调用格式 原代码 fetch("https://mp.amap.com/api/forward/aggregate?mtop.alsc.kbt.intergration.toolkit.call.queryCallBlockInfo", {"headers": {"acce…

Grafana(三)Grafana 免密登录-隐藏导航栏-主题变换

一. 免密登录 Grafana 的常用方式&#xff1a; 将配置好的Grafana图嵌入到系统页面中 为了实现可免登录访问&#xff0c;可以通过如下方式进行设置&#xff1a; 1. 修改Grafana配置文件 在Grafana的配置文件 /etc/grafana/grafana.ini 中&#xff0c;找到 [auth.anonymous] 配…

HarmonyOS开源软件Notice收集策略说明

开源软件Notice是与项目开源相关的文件&#xff0c;收集这些文件的目的是为了符合开源的规范。 收集目标 只收集打包到镜像里面的模块对应的License&#xff1b;不打包的都不收集&#xff0c;比如构建过程使用的工具&#xff08;如clang、python、ninja等&#xff09;都是不收…

如何进行正确的 CodeReview

软件开发生命周期中至关重要的一步是代码审查。它使开发人员能够显著提升代码质量。它类似于书籍的创作过程。首先&#xff0c;作者写故事&#xff0c;然后经过编辑以确保不会出现诸如混淆“you’re”和“yours”之类的错误。在这个语境中&#xff0c;代码审查指的是检查和评估…

云原生架构体系和重点概念解读

【摘要】大部分人对云原生的认识仅限于容器、微服务、DevOps等内容&#xff0c;把容器、微服务、 DevOps就等同于云原生&#xff0c;这显然是不对的。本文梳理了云原生架构体系内容并对重点概念进行了解读&#xff0c;希望对读者有所帮助。 云原生&#xff08;Cloud-Native&am…

八股文学习日常第一期(20240121)

零、前言 1、目的 帮助掌握面试题&#xff0c;就八股文相关内容展开进行学习和整理&#xff0c;也方便之后的复习和巩固。 2、八股文内容来源 ①https://blog.csdn.net/w20001118/article/details/125724647 一、具体内容分析 1、类的完整书写方式 1.1、类 [Access Mod…

java面试题——多线程01

1.java中线程的实现方式&#xff1f; 常见的一般是4种&#xff1a; 继承Thread类实现Runnable接口通过callable接口&#xff0c;实现有返回值的线程基于线程池的实现 虽说有四种&#xff0c;但究其根本&#xff0c;其实都是实现的Runnable接口 2.java中线程的状态&#xff1f;…

机器学习周报第29周

目录 摘要Abstract一、文献阅读1.论文标题2.论文摘要3.论文背景4.论文方案4.1 多视角自注意力网络4.2 距离感知4.3 方向信息4.4 短语模式 二、self-attention 摘要 本周学习了多视角自注意力网络&#xff0c;在统一的框架下联合学习输入句子的不同语言学方面。具体来说&#x…

高中电学实验4

欧姆表中值电阻为内阻。 满偏电阻e/满偏电流 量程变小&#xff0c;就是满偏电阻变小。 如果量程变为10分之1&#xff0c;满偏电阻变为10分之1。 电动势不变&#xff0c;干路电流变为原来的10倍。 就是分流的电流为量程的9倍。

【现代密码学基础】详解完美安全与不可区分安全

目录 一. 介绍 二. 不可区分性试验 三. 不可区分性与完美安全 四. 例题 五. 小结 一. 介绍 敌手完美不可区分&#xff0c;英文写做perfect adversarial indistinguishability&#xff0c;其中adversarial经常被省略不写&#xff0c;在密码学的论文中经常被简称为IND安全。…

已解决java.lang.ClassNotFoundException——java连接mysql8/mysql5

1.准备工作 1.mysql8下载安装 这里大家没必要去mysql官网安装&#xff0c;可以直接安装phpStudy_pro,毕竟小皮面板的宣言是让天下没有难配的服务器环境&#xff0c;如下是小皮面板的界面&#xff08;同样的&#xff0c;此次用到的所有资料文末公众号可免费领取&#xff09;&a…

零食折扣店,注定昙花一现?

年终岁末&#xff0c;又到了各类休闲零食产品一年一度的销售旺季。与过去不同的是&#xff0c;近年来的休闲零食赛道正因大量零食折扣店的涌现而显得热闹非凡。 随着主打折扣、低价的零食折扣店成为消费者特别是三四线下沉市场消费者的新宠&#xff0c;资本开始涌入并快速推动…

循序渐进学 JavaScript <二>

续 <一> 九、JavaScript常见内置类 9.1 原始类型的包装类 基本数据类型也可以调用属性 在理论上来说它们是没有办法获取属性或者调用方法的 原始类型是简单的值&#xff0c;默认并不能调用属性和方法js 为了可以使其获取属性和调用方法&#xff0c;对其封装了对应的包装…

【Java】Maven的基本使用

Maven的基本使用 Maven常用命令 complie&#xff1a;编译clean&#xff1a;清理test&#xff1a;测试package&#xff1a;打包install&#xff1a;安装 mvn complie mvn clean mvn test mvn package mvn installMaven生命周期 IDEA配置Maven Maven坐标 什么是坐标&#xff1f;…

有关Quick BI中当返回值为空值,行标题消失问题

一、Quick BI中的lod_ include函数 lod_ include {维度1[,维度2]...:聚合表达式[:过滤条件]} 作用&#xff1a;将表达式中的维度一起作为分组依据进行订算。其中&#xff0c; 1) 维度1[,维度2]... &#xff1a;声明维度&#xff0c;指定聚合表达式要连接到的一个或多个维…

mac安装部署gitbook教程

mac安装部署gitbook教程 前言一、安装准备二、GitBook安装项目初始化 前言 一些自己实际操作的记录。 一、安装准备 Node.js gitbook基于Node.js&#xff0c;所以需要提前安装。 下载地址&#xff1a;https://nodejs.org/en/&#xff0c;可以下载比较新的版本。(但我的建议是不…

Python正则表达式Regular Expression初探

目录 Regular 匹配规则 单字符匹配 数量匹配 边界匹配 分组匹配 贪婪与懒惰 原版说明 特殊字符 转义序列 模块方法 函数说明 匹配模式 常用匹配规则 1. 匹配出所有整数 2. 匹配11位且13开头的整数 Regular Python的re模块提供了完整的正则表达式功能。正则表达式…

Java Web现代化开发:Spring Boot + Mybatis + Redis二级缓存

Java Web现代化开发&#xff1a;Spring Boot Mybatis Redis二级缓存 背景 Spring-Boot因其提供了各种开箱即用的插件&#xff0c;使得它成为了当今最为主流的Java Web开发框架之一。Mybatis是一个十分轻量好用的ORM框架。Redis是当今十分主流的分布式key-value型数据库&…

【云上探索实验室】使用 Amazon Bedrock 体验构建Stable Diffusion-文本生成图像生成式 AI 应用

生成式人工智能&#xff08;AI&#xff09;正以惊人的速度蓬勃发展&#xff0c;不断推动着科技创新的边界。在前不久的re:Invent 2023大会上&#xff0c;Selipsky为我们重点介绍了全托管式生成式 AI 服务 Amazon Bedrock&#xff0c;并表示Amazon Bedrock 极大地降低了客户从基…

༺༽༾ཊ—设计-简单-02-工厂-模式—ཏ༿༼༻

名称&#xff1a;简单工厂 类型&#xff1a;创建型 目的&#xff1a;用 工厂方法 代替 new操作 创建实例 的方式 缺点&#xff1a;不易扩展 首先我们创建一个接口 定义两个私有方法 并在两个新建类 下继承 实现接口 【注意】&#xff1a;一旦继承接口&#xff0c;必须实现…