排序算法简记
列举几种基本的排序算法和排序思想
排序就是将一组对象按照某种逻辑顺序重新排列的过程。
一、选择排序
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”和一些相关函数被删除…...

【生成模型之二】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.…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

(转)什么是DockerCompose?它有什么作用?
一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器。 Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用
文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么?1.1.2 感知机的工作原理 1.2 感知机的简单应用:基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...
C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...

Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storms…...

【C++】纯虚函数类外可以写实现吗?
1. 答案 先说答案,可以。 2.代码测试 .h头文件 #include <iostream> #include <string>// 抽象基类 class AbstractBase { public:AbstractBase() default;virtual ~AbstractBase() default; // 默认析构函数public:virtual int PureVirtualFunct…...