排序算法汇总

每日一句:你的日积月累终会成为别人的望尘莫及

目录

常数时间的操作

选择排列

冒泡排列

【异或运算】

面试题:

1)在一个整形数组中,已知只有一种数出现了奇数次,其他的所有数都出现了偶数次,怎么找到出现了奇数次的数?(要求时间复杂度O(N),空间复杂度O(1))

2)在一个整形数组中,已知有两种数出现了奇数次,其他的所有数都出现了偶数次,怎么找到这两种数?(要求时间复杂度O(N),空间复杂度O(1))

插入排序

二分法的详解与扩展

1)在一个有序数组中,找某个数是否存在

2)在一个有序数组中,找大于等于某个数最左侧的位置

局部最小值问题

在一个数组中arr无序,且任何两个相邻的数不相等,求局部最小

对数器的概念和使用

递归行为和递归行为时间复杂度的估算

归并排序

小和问题

在一个数组中,每一个数左边比当前数小的数累加起来,叫做这个数组的小和。求一个数组的小和。

例:[1,2,4,3,5],1左边比1小的数没有;2左边比2小的数,1;4左边比4小的数,1,2;3左边比3小的数,1,2;5左边比5小的数1,2,4,3;

所以小和为1+1+2+1+2+1+2+4+3=17

荷兰国旗问题

问题一

给定一个数组arr,和一个数num,请把小于等于num的数放在数组的左边,大于num的数放在数组的右边.要求额外空间复杂度O(1),时间复杂度O(N)

问题二

给定一个数组arr和一个数num请把小于num的数放在数组的左边,等于num的数放在数组的中间,大于num的数放在数组的右边.要求额外空间复杂度O(1),时间复杂度O(N).

不改进的快速排序

heapinsert过程

heapify过程

堆排序

已知一个几乎有序的数组,几乎有序是指[如果把数组排好顺序的话,每个元素移动的距离可以不超过K,并且k相对于数组来说比较小]请选择一个合适的排序算法针对这个数据进行排序。

比较器的使用

桶排序思想下的排序

排序算法的稳定性及其汇总


常数时间的操作

一个操作如果和样本的数据量没有关系,每次都是固定时间内完成的操作,叫做常数操作

时间复杂度为一个算法流程中,常数操作数量的一个指标。

常用O(读作bigO)来表示。具体来说,先要对一个算法流程非常熟悉,然后去写出这个算法流程中,发生了多少常数操作,进而总结出常数操作数量的表达式。

在表达式中,只要高阶项,不要低阶项的系数,剩下的部分如果为f(N),那么时间复杂度为O(f(N))

评价一个算法流程的好坏,先看时间复杂度的指标,然后再分析不同数据样本下的实际运行时间,也就是“常数项时间”

数组、+、-、*、/、位运算是常数操作

链表不是常数操作

额外空间复杂度

指这个流程需要多少额外空间才能支持计算下来

———————————————————————————————————————

选择排列

冒泡排列

相邻比较,谁大谁往右移

【异或运算】

1)0^N=N  N^N=0

2)  满足交换、结合律

 a^b=b^a   (a^b)^c=a^(b^c)

(抖机灵法:不用额外分配一块内存空间)

int a=甲 int b=乙

a=a^b;  ——>a=甲^乙 b=乙;

b=a^b;  ——>a=甲^乙 b=甲^乙^乙=甲^0=甲;

a=a^b;  ——>a=甲^乙^甲=乙^0= b=

前提:a和b在内存里是两块独立的区域,i位置不能等于j位置,否则会异或成0

面试题:

1)在一个整形数组中,已知只有一种数出现了奇数次,其他的所有数都出现了偶数次,怎么找到出现了奇数次的数?(要求时间复杂度O(N),空间复杂度O(1))

———————————————————————————————————————

2)在一个整形数组中,已知有种数出现了奇数次,其他的所有数都出现了偶数次,怎么找到这两种数?(要求时间复杂度O(N),空间复杂度O(1))

  1. 先让eor从头异或到尾,结尾时eor=a^b≠0
  2. a和b一定有一位不一样的,假设第8位因为把整个数组分成2类;第1类:第8位是0;第2类:第8位是1

         eor1只异或第8位是1的数;eor1为a或b

      3.eor^eor1为另一个a或b

把一个不为0的数最右侧的1,提取出来的操作:int rightone=eor&(~eor+1);

插入排序

时间复杂度O(),额外空间复杂度O(1)

算法流程按照最差情况来估计时间复杂度

数据状况不同会导致算法流程的时间复杂度不一样

选择排序和冒泡排序算法和数据状况无关

二分法的详解与扩展

1)在一个有序数组中,找某个数是否存在

  1. 2)在一个有序数组中,找大于等于某个数最左侧的位置

局部最小值问题

在一个数组中arr无序,且任何两个相邻的数不相等,求局部最小

 

优化方向1)数据状况2)问题标准

对数器的概念和使用

  1. 有一个你想要测的方法a
  2. 实现复杂度不好但是容易实现的方法b
  3. 实现一个随机样本产生器
  4. 把方法a和方法b跑相同的随机样本,看得到的结果是否一样
  5. 如果有一个随机样本使得比对结果不一致,打印样本进行人工干预,改对方法a或者方法b
  6. 当样本数量很多时对比测试依然正确,可以确定方法a已经正确

递归行为和递归行为时间复杂度的估算

用递归方法找一个数组中的最大值,系统上到底怎么做的?

Master公式的使用

T(N)=a*T(Nb)+O()

  1. >d  复杂度为O()
  2. =d  复杂度为O()
  3. <d  复杂度为O()

中点:mid=L+=L+(R-L)>>1

归并排序

  1. 整体就是一个简单递归,左边排好序,右边排好序,让其整体有序
  2. 让其整体有序的过程用了外排序方法
  3. 利用master公式来求解时间复杂度
  4. 归并排序的实质

时间复杂度O(),额外空间复杂度O(N)

选择、冒泡、插入O()浪费了大量的比较行为 

归并排序比较行为没有被浪费

比较行为被留下来了,变成了一个整体有序的部分,信息往下传递

—————————————————————————————————————

归并排序的扩展

小和问题

在一个数组中,每一个数左边比当前数小的数累加起来,叫做这个数组的小和。求一个数组的小和。

例:[1,2,4,3,5],1左边比1小的数没有;2左边比2小的数,1;4左边比4小的数,1,2;3左边比3小的数,1,2;5左边比5小的数1,2,4,3

所以小和为1+1+2+1+2+1+2+4+3=17

逆序对问题

在一个数组中,左边的数如果比右边的数大,则这两个数构成一个逆序对,请打印所有逆序对。

例如:数组[3,2,4,5,0],存在逆序对[3,2]、[3,0]、[2,0]、[4,0]、[5,0]

—————————————————————————————————————

荷兰国旗问题

问题一

给定一个数组arr,和一个数num,请把小于等于num的数放在数组的左边,大于num的数放在数组的右边.要求额外空间复杂度O(1),时间复杂度O(N)

问题二

给定一个数组arr和一个数num请把小于num的数放在数组的左边,等于num的数放在数组的中间,大于num的数放在数组的右边.要求额外空间复杂度O(1),时间复杂度O(N).

—————————————————————————————————————

不改进的快速排序

1)把数组范围中的最后一个数作为划分值,然后把数组通过荷兰国旗问题分成三个部分

左侧<划分值、中间==划分值、右侧>划分值

2)对左侧范围和右侧范围,递归执行

分析:

  1. 划分值越靠近两侧,复杂度越高;划分值越靠近中间,复杂度越低
  2. 可以轻而易举的举出最差的例子,所以不改进的快速排序时间复杂度为O(

快排额外空间复杂度O(

  1. 堆结构就是用数组实现的完全二叉树结构
  2. 完全二叉树中如果每棵子树的最大值都在顶部就是大根堆
  3. 完全二叉树中如果每棵子树的最小值都在顶部就是小根堆
  4. 堆结构的heapInsert(一路往上走)与heapify(一路往下走)操作
  5. 堆结构的增大和减少
  6. 优先级队列结构就是堆结构

heapinsert过程

heapify过程

堆排序

1.先让整个数组都变成大根堆结构,建立堆的过程;

  1. )从上到下的方法,时间复杂度O(N
  2. 从下到上的方法,时间复杂度O(N)

2.把堆的最大值和堆末尾的值交换,然后减少堆的大小,之后,再去调整堆,一直周而复始,时间复杂度O(N

3.  堆的大小减小成0之后,排序完成

堆排序扩展题目

已知一个几乎有序的数组,几乎有序是指[如果把数组排好顺序的话,每个元素移动的距离可以不超过K,并且k相对于数组来说比较小]请选择一个合适的排序算法针对这个数据进行排序。

小根堆在Java中优先级队列意思

PriorityQueue<Integer>  heap=new PriorityQueue<>();

1.扩容怎么办?

扩容次数O()水平

每次扩容O(N)水平

整体O()水平

单位平均下来O()水平

2.系统写好的堆,不支持已经实现了的堆用很轻的代价,使某一结构变值,调整自己写的堆

比较器的使用

  1. 比较器的实质就是重载比较运算符
  2. 比较器可以很好的应用在特殊标准的排序上
  3. 比较器可以很好的应用在根据特殊标准排序的结构上

———————————————————————————————————————

不基于比较的排序都是根据数据状况做的排序

桶排序思想下的排序

  1. 计数排序
  2. 基数排序

分析

  1. 桶排序思想下的排序都是不基于比较的排序
  2. 时间复杂度O(N),额外空间复杂度O(N)
  3. 应用范围有限,需要样本的数据状况满足桶的划分

 

排序算法的稳定性及其汇总

同样值的个体之间,如果不因为排序而改变相对次序,就是这个排序是有稳定性的;否则就没有

不具有稳定性的排序:选择排序、快速排序、堆排序;

具备稳定性的排序:冒泡排序、插入排序、归并排序、一切桶排序思想下的排序

[相等的时候不让交换,保持了稳定性]

目前没有找到时间复杂度O(),额外空间复杂度O(1),又稳定的排序

选择排序

从0~N-1位置上选一最小值,放0位置上……

冒泡排序

0~1上比较交换,1~2,2~3,3~4,4~5,5位置排好

0~1上比较交换,1~2,2~3,3~4 ,4位置排好

 

……

插入排序

0~0有序

0~1交换、有序

0~2交换、有序

    

时间复杂度

额外空间复杂度

稳定性

选择

O(

O(1)

×

冒泡

O(

O(1)

插入

O(

O(1)

归并

O(

O(N)

快排

O(

O(

×

O(

O(1)

×

常见的坑

  1. 归并排序的额外空间复杂度可以变为O(1),但非常难,不需要掌握,有兴趣可以搜“归并排序内部缓存法”
  2. “原地归并排序”的帖子都是垃圾,会让归并排序的时间复杂度变成O(
  3. 快排可以做到稳定性,但非常难,不需要掌握,可以搜“01 stable sort”
  4. 所有的改进都不重要,因为目前没有找到时间复杂度O(),额外空间复杂度O(1),又稳定的排序
  5. 有一道题目是奇数放在数组左边,偶数放在数组右边,还要求原始的相对次序不变,碰到这个问题,可以怼面试官

工程上对排序的改进

  1. 充分利用O()和O()排序各自的优势
  2. 稳定性的考虑

大样本量时

调度     快排   O(

小样本量时

  插入  O(

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

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

相关文章

为何押注AI大模型的微软云,业绩增速反而不如谷歌云?

科技云报道原创。 上周微软、谷歌、Meta等国外科技公司相继发布最新财报。作为与人工智能、云计算和数字广告等领域相关的巨头&#xff0c;它们的一举一动都将对市场产生影响&#xff0c;同时也吸引着众多从业者的关注。 在国外三大云巨头中&#xff0c;谷歌云的市场份额长期…

渗透测试:Linux提权精讲(二)之sudo方法第二期

目录 写在开头 sudo expect sudo fail2ban sudo find sudo flock sudo ftp sudo gcc sudo gdb sudo git sudo gzip/gunzip sudo iftop sudo hping3 sudo java 总结与思考 写在开头 本文在上一篇博客的基础上继续讲解渗透测试的sudo提权方法。相关内容的介绍与背…

docker 部署 mysql8.0 无法访问

文章目录 &#x1f5fd;先来说我的是什么情况&#x1fa81;问题描述&#x1fa81;解决方法&#xff1a;✔️1 重启iptables✔️2 重启docker &#x1fa81;其他有可能连不上的原因✔️1 客户端不支持caching_sha2_password的加密方式✔️2 my.conf 配置只有本机可以访问 &#…

CTF:信息泄露.(CTFHub靶场环境)

CTF&#xff1a;信息泄露.&#xff08;CTFHub靶场环境&#xff09; “ 信息泄露 ” 是指网站无意间向用户泄露敏感信息&#xff0c;泄露了有关于其他用户的数据&#xff0c;例如&#xff1a;另一个用户名的财务信息&#xff0c;敏感的商业 或 商业数据 &#xff0c;还有一些有…

读取application-dev.properties的中文乱码【bug】

读取application-dev.properties的中文编码【bug】 2023-7-30 22:37:46 版权 禁止其他平台发布时删除以下此话 本文首次发布于CSDN平台 作者是CSDN日星月云 博客主页是https://blog.csdn.net/qq_51625007 禁止其他平台发布时删除以上此话 bug 读取application-dev.propert…

2023年的深度学习入门指南(20) - LLaMA 2模型解析

2023年的深度学习入门指南(20) - LLaMA 2模型解析 上一节我们把LLaMA 2的生成过程以及封装的过程的代码简单介绍了下。还差LLaMA 2的模型部分没有介绍。这一节我们就来介绍下LLaMA 2的模型部分。 这一部分需要一些深度神经网络的基础知识&#xff0c;不懂的话不用着急&#xf…

建木使用进阶-创建密钥管理

阿丹&#xff1a; 第一次我们进入建木&#xff0c;第一件事情就是配置我们相关的密钥。 解读&#xff1a; 在建木中我们可以进行创建密钥来对我们服务器等密码进行方便的管理。 注意&#xff1a; 登录的时候账号为&#xff1a;admin 密码为&#xff1a;123456 这是初始…

Windows环境下git客户端中的git-bash和MinGW64

我们在 Windows10 操作系统下&#xff0c;安装了 git 客户端之后&#xff0c;可以通过 git-bash.exe 打开一个 shell&#xff1a; 执行一些 linux 系统里的命令&#xff1a; 注意到上图紫色的 MINGW64. Mingw-w64 是原始 mingw.org 项目的改进版&#xff0c;旨在支持 Window…

【playbook】Ansible的脚本----playbook剧本

Ansible的脚本----playbook剧本 1.playbook剧本组成2.playbook剧本实战演练2.1 实战演练一&#xff1a;给被管理主机安装Apache服务2.2 实战演练二&#xff1a;使用sudo命令将远程主机的普通用户提权为root用户2.3 实战演练三&#xff1a;when条件判断指定的IP地址2.4 实战演练…

SpringBoot中ErrorPage(错误页面)的使用--【ErrorPage组件】

SpringBoot系列文章目录 SpringBoot知识范围-学习步骤–【思维导图知识范围】 文章目录 SpringBoot系列文章目录本系列校训 SpringBoot技术很多很多环境及工具&#xff1a;必要的知识深层一些的知识 上效果图在Spring Boot里使用ErrorPage还要注意的是 配套资源作业&#xff…

使用Windbg分析从系统应用程序日志中找到的系统自动生成的dump文件去排查问题

目录 1、尝试将Windbg附加到目标进程上进行动态调试&#xff0c;但Windbg并没有捕获到 2、在系统应用程序日志中找到了系统在程序发生异常时自动生成的dump文件 2.1、查看应用程序日志的入口 2.2、在应用程序日志中找到系统自动生成的dump文件 3、使用Windbg静态分析dump文…

Mysql的锁

加锁的目的 对数据加锁是为了解决事务的隔离性问题&#xff0c;让事务之前相互不影响&#xff0c;每个事务进行操作的时候都必须先加上一把锁&#xff0c;防止其他事务同时操作数据。 事务的属性 &#xff08;ACID&#xff09; 原子性 一致性 隔离性 持久性 事务的隔离级别 锁…

大数据课程D4——hadoop的YARN

文章作者邮箱&#xff1a;yugongshiyesina.cn 地址&#xff1a;广东惠州 ▲ 本章节目的 ⚪ 了解YARN的概念和结构&#xff1b; ⚪ 掌握YARN的资源调度流程&#xff1b; ⚪ 了解Hadoop支持的资源调度器&#xff1a;FIFO、Capacity、Fair&#xff1b; ⚪ 掌握YA…

jenkins自定义邮件发送人姓名

jenkins发送邮件的时候发送人姓名默认的&#xff0c;如果要自定义发件人姓名&#xff0c;只需要修改如下信息即可&#xff1a; 系统管理-system-Jenkins Location下的系统管理员邮件地址 格式为&#xff1a;自定义姓名<邮件地址>

三分钟白话RocketMQ系列—— 核心概念

目录 关键字摘要 Q1&#xff1a;RocketMQ是什么&#xff1f; Q2: 作为消息中间件&#xff0c;RocketMQ和kafka有什么区别&#xff1f; Q3: RocketMQ的基本架构是怎样的&#xff1f; Q4&#xff1a;RocketMQ有哪些核心概念&#xff1f; 总结 RocketMQ是一个开源的分布式消…

测试|测试分类

测试|测试分类 文章目录 测试|测试分类1.按照测试对象分类&#xff08;部分掌握&#xff09;2.是否查看代码&#xff1a;黑盒、白盒灰盒测试3.按开发阶段分&#xff1a;单元、集成、系统及验收测试4.按实施组织分&#xff1a;α、β、第三方测试5.按是否运行代码&#xff1a;静…

SpringMVC程序开发

1.什么是Spring MVC? Spring Web MVC是基于Servlet API构建的原始的Web框架&#xff0c;从一开始是就包含在Spring框架中。它的正式名称“Spring Web MVC"来自其源模板的名称&#xff08;Spring-webmvc)&#xff0c;但通常被称为“Spring MVC" 从上述的定义我们可…

Unity游戏源码分享-ARPG游戏Darklight.rar

Unity游戏源码分享-ARPG游戏Darklight.rar 玩法 项目地址&#xff1a;https://download.csdn.net/download/Highning0007/88105464

Android Studio 的版本控制Git

Android Studio 的版本控制Git。 Git 是最流行的版本控制工具&#xff0c;本文介绍其在安卓开发环境Android Studio下的使用。 本文参考链接是&#xff1a;https://learntodroid.com/how-to-use-git-and-github-in-android-studio/ 一&#xff1a;Android Studio 中设置Git …

Flowable-服务-微服务任务

目录 定义图形标记XML内容界面操作 定义 Sc 任务不是 BPMN 2.0 规范定义的官方任务&#xff0c;在 Flowable 中&#xff0c;Sc 任务是作为一种特殊的服务 任务来实现的&#xff0c;主要调用springcloud的微服务使用。 图形标记 由于 Sc 任务不是 BPMN 2.0 规范的“官方”任务…