当前位置: 首页 > news >正文

排序算法简记

列举几种基本的排序算法和排序思想

排序就是将一组对象按照某种逻辑顺序重新排列的过程。

一、选择排序

1、基本原理

最基本的排序,每次都从原有数据中选择最小或最大的数组放入新数据集中

2、步骤(以从小到大为例)

首先, 找到数组中最小的那个元素,

其次, 将它和数组的第一个元素交换位置( 如果第一个元素就是最小元素那么它就和自己交换) 。

再次, 在剩下的元素中找到最小的元素, 将它与数组的第二个元素交换位置。 如此往复, 直到将整个数组排序。

这种方法叫做选择排序, 因为它在不断地选择剩余元素之中的最小者

3、特点

复杂度 O(n2)

运行时间和输入无关

数据移动是最少的

二、插入排序

1、基本原理

为了给要插入的元素腾出空间, 我们需要将其余所有元素在插入之前都向右移动一位。 这种算法叫做插入排序

2、特点

插入排序所需的时间取决于输入中元素的初始顺序

插入排序对于实际应用中常见的某些类型的非随机数组很有效

3、几种典型的部分有序的数组:
(1)数组中每个元素距离它的最终位置都不远;
(2)一个有序的大数组接一个小数组;
(3) 数组中只有几个元素的位置不正确。
插入排序对这样的数组很有效, 而选择排序则不然

4、提升方法

要大幅提高插入排序的速度并不难, 只需要在内循环中将较大的元素都向右移动而不总是交换
两个元素( 这样访问数组的次数就能减半)

三、希尔排序

1、基本原理

希尔排序的思想是使数组中任意间隔为 h 的元素都是有序的。

这样的数组被称为 h 有序数组。

2、h有序数组

 一个 h 有序数组就是 h 个互相独立的有序数组编织在一起组成的一个数组 。

在进行排序时,如果 h 很大, 我们就能将元素移动到很远的地方,为实现更小的 h 有序创造方便。

用这种方式,对于任意以 1 结尾的 h 序列,都能够将数组排序。

3、实现方法

对于每个 h, 用插入排序将 h 个子数组独立地排序。

但因为子数组是相互独立的, 一个更简单的方法是在 h- 子数组中将每个元素交换到比它大的元素之前去( 将比它大的元素向右移动一格) 。

只需要在插入排序的代码中将移动元素的距离由 1 改为 h 即可。

这样, 希尔排序的实现就转化为了一个类似于插入排序但使用不同增量的过程。

四、归并排序

1、基本原理

两个有序的数组归并成一个更大的有序数组。

2、基本方法

要将一个数组排序,可以先(递归地)将它分成两半分别排序,然后将结果归并起来。

实现归并的一种直截了当的办法是将两个不同的有序数组归并到第三个数组中

3、特点

它能够保证将任意长度为 N 的数组排序所需时间和 NlogN 成正比;

它的主要缺点则是它所需的额外空间和 N 成正比

4、几种方法

原地归并

是将两个不同的有序数组归并到第三个数组中

自顶向下

基于分支思想,如果能将两个子数组排序,就能够通过归并两个子数组来将整个数组排序

自底向上

先归并那些微型数组,然后再成对归并得到的子数组,直到将整个数组归并在一起。这种实现方法比标准递归方法 所需要的代码量更少

5、局限性
(1) 归并排序的空间复杂度不是最优的;
(2)在实践中不一定会遇到最坏情况;
(3)除了比较,算法的其他操作(例如访问数组)也可能很重要;
(4)不进行比较也能将某些数据排序。

五、快速排序 

1、基本原理

快速排序是一种常用的排序算法,比选择排序快得多。

快速排序使用了D&C。

2、基本步骤

首先,从数组中选择一个元素,这个元素被称为基准值(pivot)。

接下来,找出比基准值小的元素以及比基准值大的元素,被称为分区( partitioning)

得到

(1)一个由所有小于基准值的数字组成的子数组;

(2)基准值;
(3)一个由所有大于基准值的数组组成的子数组

如果子数组是有序的,就可以合并得到一个有序的数组:左边的数组 + 基准值 + 右边的数组
对于包含两个元素的数组(左边的子数组)以及空数组(右边的子数组),只要对这两个子数组进行快速排序,再合并结果,就能得到有序数组
总结得到基本步骤:

(1) 选择基准值。
(2) 将数组分成两个子数组:小于基准值的元素和大于基准值的元素。
(3) 对这两个子数组进行快速排序

3、特点

快速排序的独特之处在于,其速度取决于选择的基准值

在最糟情况下,其运行时间为O(n2)。

平均情况下,快速排序的运行时间为O(nlogn)

最佳情况也是平均情况。只要你每次都随机地选择一个数组元素作为基准值,快速排序的平均运行时间就将为O(nlogn)。快速排序是最快的排序算法之一,也是D&C典范。

六、优先队列

1、数据结构

一个合适的数据结构应该支持两种操作: 删除最大元素和插入元素。这种数据类型叫做优先队列。

优先队列的使用和队列(删除最老的元素)以及栈(删除最新的元素)类似

2、排序方法

通过插入一列元素然后一个个地删掉其中最小的元素,我们可以用优先队列实现排序算法。

堆排序就是基于堆的优先队列的实现。

3、二叉堆

数据结构二叉堆能够很好地实现优先队列的基本操作。

在二叉堆的数组中,每个元素都要保证大于等于另两个特定位置的元素。

相应地,这些位置的元素又至少要大于等于数组中的另两个元素,以此类推

当一棵二叉树的每个结点都大于等于它的两个子结点时,它被称为堆有序

4、优先队列排序

我们可以把任意优先队列变成一种排序方法。

将所有元素插入一个查找最小元素的优先队列,然后再重复调用删除最小元素的操作来将它们按顺序删去。

用无序数组实现的优先队列这么做相当于进行一次选择排序

5、堆排序

堆排序可以分为两个阶段。

在堆的构造阶段中,我们将原始数组重新组织安排进一个堆中;

然后在下沉排序阶段,我们从堆中按递减顺序取出所有元素并得到排序结果。

相关文章:

排序算法简记

列举几种基本的排序算法和排序思想 排序就是将一组对象按照某种逻辑顺序重新排列的过程。 一、选择排序 1、基本原理 最基本的排序,每次都从原有数据中选择最小或最大的数组放入新数据集中 2、步骤(以从小到大为例) 首先, 找到数组中最小的那个元素…...

Stable diffusion inference 多卡并行

stable diffusion 推理过程 多卡并行 注意事项 以SDXL为例,指定GPU,添加device_map参数信息 device_map {add_embedding: 1,decoder: 1,encoder: 1,conv_in: 1,conv_out: 1,post_quant_conv: 1,text_model: 6,conv_norm_out: 1,quant_conv: 1,time_em…...

Docker:namespace环境隔离 CGroup资源控制

Docker:namespace环境隔离 & CGroup资源控制 Docker虚拟机容器 namespace相关命令ddmkfsdfmountunshare 进程隔离文件隔离 CGroup相关命令pidstatstresscgroup控制 内存控制CPU控制 Docker 在开发中,经常会遇到环境问题,比如程序依赖某个…...

鼠标增强工具 MousePlus v5.3.9.0 中文绿色版

MousePlus 是一款功能强大的鼠标增强工具,它可以帮助用户提高鼠标操作效率和精准度。该软件可以自定义鼠标的各种功能和行为,让用户根据自己的习惯和需求来调整鼠标的表现。 详细功能 自定义鼠标按钮功能:可以为鼠标的各个按钮设置不同的功能…...

Android 圆形进度条CircleProgressView 基础版

一个最基础的自定义View 圆形进度条,可设置背景色、进度条颜色(渐变色)下载进度控制;可二次定制度高; 核心代码: Overrideprotected void onDraw(NonNull Canvas canvas) {super.onDraw(canvas);int mW g…...

理解磁盘结构---CHS---LAB---文件系统

1,初步了解磁盘 机械磁盘是计算机中唯的一个机械设备, 特点是慢,容量大,价格便宜。 磁盘上面的光面,由数不清的小磁铁构成,我们知道磁铁是有n/s极的,这刚好与二进制的&…...

我在1024谈华为

华为的发展历程与技术创新 华为自成立以来,一直是通信技术领域的重要参与者。让我们回顾一下华为的一些关键发展里程碑: 1987年,华为在深圳成立,起初专注于电话交换网络的研发和销售。 进入1990年代,华为转型为通信…...

NVR小程序接入平台/设备EasyNVR多品牌NVR管理工具/设备视频监控解决方案

随着科技的飞速发展,安防视频监控已成为维护公共安全、提升管理效率的重要手段。在这一领域中,NVR小程序接入平台/设备EasyNVR凭借其灵活的部署方式、强大的功能以及卓越的性能表现,脱颖而出,引领着安防视频监控的新纪元。 NVR小程…...

二叉树前序遍历的 Java 实现,包括递归和非递归两种方式

二叉树前序遍历是一种遍历树节点的方式,遵循特定的顺序。其基本过程可以总结为以下几个步骤: 前序遍历的顺序 访问根节点:首先处理当前节点。 递归遍历左子树:然后依次访问左子树。 递归遍历右子树:最后访问右子树。 …...

QT开发:构建现代UI的利器:深入详解QML和Qt Quick基础开发技术

目录 引言 目录 1. 什么是QML和Qt Quick QML的优势 2. QML基础语法 组件 属性 JavaScript表达式 3. 数据绑定 直接绑定 双向绑定 4. 属性和属性别名 属性 属性别名 5. 信号与槽机制 定义信号 处理信号 6. 动画与过渡效果 简单动画 过渡效果 7. 构…...

vue前端使用pdfjs与pdfdist-mergeofd 实现预览pdf并翻页,同时解决预览pdf显示模糊的问题

vue前端使用pdfjs与pdfdist-mergeofd 实现预览pdf并翻页,同时解决预览pdf显示模糊的问题 插件介绍 pdfdist-mergeofd插件的作用可查看这篇文章,同时使用ofdjs和pdfjs遇到的问题,和解决方法——懒加载 该插件主要是为了解决pdfjs和ofdjs同时…...

C语言——回调函数

1、回调函数 在学习了函数之后,我发现了一个比较难的函数——回调函数 回调函数 (Callback Function) 指的是一种函数,它被作为参数传递给另一个函数,并在满足特定条件或事件发生后被调用执行。 它允许你将一段代码延迟执行,或者…...

2016年ATom-1飞行活动期间以10秒间隔进行的一氧化碳(CO)观测数据

目录 简介 摘要 代码 引用 网址推荐 知识星球 机器学习 ATom: Observed and GEOS-5 Simulated CO Concentrations with Tagged Tracers for ATom-1 简介 该数据集包含2016年ATom-1飞行活动期间以10秒间隔进行的一氧化碳(CO)观测数据,…...

MLM之Emu3:Emu3(仅需下一个Token预测)的简介、安装和使用方法、案例应用之详细攻略

MLM之Emu3:Emu3(仅需下一个Token预测)的简介、安装和使用方法、案例应用之详细攻略 导读:这篇论文介绍了Emu3,一个基于单一Transformer架构,仅使用下一个token预测进行训练的多模态模型。 >> 背景痛点: 多模态任…...

Spring Boot与Flyway实现自动化数据库版本控制

一、为什么使用Flyway 最简单的一个项目是一个软件连接到一个数据库,但是大多数项目中我们不仅要处理我们开发环境的副本,还需要处理其他很多副本。例如:开发环境、测试环境、生产环境。想到数据库管理,我们立刻就能想到一系列问…...

input角度:I2C触摸屏驱动分析和编写一个简单的I2C驱动程序

往期内容 本专栏往期内容: input子系统的框架和重要数据结构详解-CSDN博客input device和input handler的注册以及匹配过程解析-CSDN博客input device和input handler的注册以及匹配过程解析-CSDN博客编写一个简单的Iinput_dev框架-CSDN博客GPIO按键驱动分析与使用&…...

SQL-lab靶场less1-4

说明:部分内容来源于网络,如有侵权联系删除 前情提要:搭建sql-lab本地靶场的时候发现一些致命的报错: 这个程序只能在php 5.x上运行,在php 7及更高版本上,函数“mysql_query”和一些相关函数被删除&#xf…...

【生成模型之二】diffusion model模型

【算法简历修改、职业规划、校招实习咨询请私信联系】 【Latent-Diffusion 代码】 生成模型分类概述 Diffusion Model,这一深度生成模型,源自物理学中的扩散现象,呈现出令人瞩目的创新性。与传统的生成模型,如VAE、GAN相比&…...

记录 Maven 版本覆盖 Bug 的解决过程

背景 在使用 Maven 进行项目管理时,依赖版本的管理是一个常见且重要的环节。最近,在我的项目中遇到了一个关于依赖版本覆盖的 Bug,这个问题导致了 Apollo 框架的版本不一致,影响了项目的正常运行。以下是我解决这个问题的过程记录…...

【K8S系列】Kubernetes Service 基础知识 详细介绍

在 Kubernetes 中,Service 是一种抽象的资源,用于定义一组 Pod 的访问策略。它为这些 Pod 提供了一个稳定的访问入口,解决了 Pod 可能频繁变化的问题。本文将详细介绍 Kubernetes Service 的类型、功能、使用场景、DNS 和负载均衡等方面。 1.…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...

React hook之useRef

React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

Objective-C常用命名规范总结

【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...

零基础设计模式——行为型模式 - 责任链模式

第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)

Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...

QT3D学习笔记——圆台、圆锥

类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体(对象或容器)QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质(定义颜色、反光等)QFirstPersonC…...

【JavaSE】多线程基础学习笔记

多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...