3.5.3、查找和排序算法-插入类排序和选择类排序

news2024/11/28 6:45:20

术语说明

  • 稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面;

  • 不稳定:如果a原本在b的前面,而a=b,排序之后a可能会出现在b的后面;
    例如:数组{1,2,3,3,4,7,6}。如果排序后,两个3的位置没有发生变化就是稳定;若两个3发生了调换就是不稳定

  • ln-place:占用常数内存,不占用额外内存。例如选择排序只需要占用1个内存空间交换元素即可,不需要额外申请内存空间

  • Out-place:不仅占用常数内存,还需要占用额外内存。例如基数排序

  • 时间复杂度:一个算法执行所耗费的时间。

  • 空间复杂度:运行完一个程序所需内存的大小。

排序的算法有很多,大致可以分类如下:

  • 插入类排序:直接插入排序、希尔排序。
  • 交换类排序:冒泡排序、快速排序。
  • 选择类排序:简单选择排序、堆排序。
  • 归并排序。
  • 基数排序。

插入排序

直接插入排序是一种简单的排序方法,具体做法是:在插入第个关键码时k1,k2,
ki-1已经排好序,这时将关键码k依次与关键码ki-1,ki-2等进行比较,找到ki应该插入的位置时停下来,将插入位置及其后的关键码依次向后移动,然后插入k。
在这里插入图片描述
插入排序就如图:有1点、2点、4点的牌,接下来有一张3点的牌需要将插入进去。计算机不会和人类一样肉眼看到后就插到2和4之间的。需要和4比较,和2比较后将4后移,插入到2和4之间

要注意的是,前提条件是前-1个元素是有序的,第个元素依次从第-1个元素往前比较,直到找到一个比第个元素值小的元素,而后插入,插入位置及其后的元素依次向后移动,本质是插入排序。

在这里插入图片描述
上图中,59依次向前比较,先和68比较,再和57比较,发现57比他小,才插入。

希尔排序

希尔排序的基本思想是:先将整个待排记录序列分割成若干子序列,然后分别进行直接插入排序,待整个序列中的记录基本有序时,再对全体记录进行一次直接插入排序。
具体做法是:
先取一个小于的整数d1,作为第一个增量,把文件的全部记录分成d1个组,即将所有距离为d1倍数序号的记录放在同一个组中,在各组内进行直接插入排序:然后取第二个增量d2(d2<d1),重复上述分组和排序工作,依此类推,直到所取的增量di=1(di<di-1<.…<d2<d1),即所有记录放在同一组进行直接插入排序为止。

希尔排序是对直接插入排序算法的改进,适合于大数据的排序,采用分组的方法,可以提高效率
在这里插入图片描述
为什么不直接进行插入排序呢?插入排序在元素几乎有序的情况下,效率是会增加的。也就意味着我们花很大功夫去分组排序都是为了最后一次的排序进行铺垫,它把整个序列排成近乎有序,然后对它进行最后一次插入排序,这样的效率会比较好。
增量序列(5,3,1)的值怎么设置?最后一个值肯定是1,因为最后一次要对每个元素进行一次完整的排序。最大的值至少要分成两块。如果我们的初始序列很长,那么我们的增量序列就不仅仅只有3个元素了,可能是5、7、9个元素。

简单选择排序

n个记录进行简单选择排序的基本方法是:通过n-i(1≤i≤n)在次关键字之间的比较,从n-+1个记录中选出关键字最小的记录,并和第i个记录进行交换,当i等于时所有记录有序排列。

本质就是每次选择出最小的元素进行交换,主要是选择过程,最值的交换过程只有一次。示例如下:
在这里插入图片描述
注意:每次都是拿着下标最小的元素进行比较,即上图第二次排序:68和59交换位置后,接下来是拿59和后面的元素进行比较。

堆排序

堆排序)(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点

堆排序的方法可分为两步:

  1. 依据给出的待排序关键字建立初始堆,如果是升序就是小顶堆,降序就是大顶堆
    构建二叉树,根部元素是最大是降序,根部元素最小是升序
  2. 把最后一个元素输入到堆顶,并调整堆。重复上述步骤。

降序->大顶堆
步骤1:创建初始堆

  • 首先将给出的数组{1,3,4,5,72,6,8,0}按完全二叉树规则健立图1.1
  • 而后,找到此完全二叉树的最后一个非叶子节点(也即最后一颗子树),比较此叶子节点和其两个孩子结点的大小,若小,则与其孩子结点中最大的结点进行交换,如图1.2所示;
  • 依据此规则再去找倒数第二个非叶子节点;
  • 这是只有一层的情况,当涉及到多层次时,如图1.3和1.4所示,将3交换下来,又打破了之前的堆,因此,又要进行变换,如图1.5所示
  • 之后,就按上述规则依次对非叶子节点进行变换。
    在这里插入图片描述
    可以得到最大值8。将8放到一个新的序列(待排序)里面去。然后把最尾部(0)放到首位(原来8的位置)。重新构建一次大顶堆

升序->小顶堆
步骤2:把最后一个元素输入到堆顶

  • 由图可知,取走堆顶元素后,将堆中最后一个元素移入堆顶
  • 而后,按照初始建堆中的方法与其孩子结点比较大小,依次向下判断交换成为一个新的堆,再取走堆顶元素
  • 重复此过程。

在这里插入图片描述
堆排序适用于在多个元素中找出前几名的方案设计,因为堆排序是选择排
序,而目选择出前几名的效率很高。找最大的几个或者最小的几个效率还是不错的

冒泡排序

n个记录进行冒泡排序的方法是:首先将第一个记录的关键字和第二个记录的关键字进行比较,若为逆序,则交换这两个记录的值,然后比较第二个记录和第三个记录的关键字,依此类推,直到第n-1个记录和第个记录的关键字比较过为止。上述过程称为第一趟冒泡排序,其结果是关键字最大的记录被交换到第个记录的位置上。然后进行第二趟冒泡排序,对前n-1个记录进行同样的操作,其结果是关键字次大的记录被交换到第n-1个记录的位置上。最多进行n-1趟,所有记录有序排列。若在某趟冒泡排序过程没有进行相邻位置的元素交换处理,则可结束排序过程。
在这里插入图片描述
可以从左到右开始比较,也可以从右到左开始比较。上图是从右到左开始比较的
本质是从最后两个元素开始进行比较,将较小的元素交换到前面去,依次进行比较交换。较小的气泡浮到水面上。

选择排序是拿着一个元素和后面的每一个元素进行比较
冒泡排序是两两相邻的元素进行比较

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

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

相关文章

【嵌入式之RTOS】死锁问题详解

目录 一、什么是死锁 二、产生死锁的四个必要条件 三、避免死锁的方法 四、实际应用中的考虑 一、什么是死锁 死锁&#xff08;Deadlock&#xff09;是多任务或多线程环境中一个常见的问题&#xff0c;尤其是在实时操作系统&#xff08;RTOS&#xff09;中&#xff0c;如果…

kvm虚拟化平台部署

kvm虚拟化平台部署 kvm概念简介 kvm自linux2.6版本以后就整合到内核中&#xff0c;因此可以看做是一个原生架构. kvm虚拟化架构 硬件底层提供物理层面的硬件支持 linux&#xff08;host&#xff09;&#xff0c;就相当于这个架构中的宿主机&#xff0c;上面运行了多个虚拟机。…

替换后端国外身份目录服务,宁盾身份域管接管FileNet助力国产化升级

IBM FileNet 是一款优秀的企业内容管理解决方案&#xff0c;为客户提供了领先的文档管理和流程管理集成环境&#xff0c;被大量企业所采用。FileNet 需要使用企业级的目录服务器&#xff08;LDAP&#xff09;作为其用户管理系统&#xff0c;满足其认证和授权的需求。对于 LDAP …

最高200万!苏州成都杭州的这些AI政策补贴,你拿到了吗?

随着全球人工智能技术的迅猛发展&#xff0c;地方政府纷纷出台相关政策以抢占未来科技的制高点。苏州 成都 杭州这三个城市更是推出了一系列AI政策补贴&#xff0c;旨在通过多方面支持&#xff0c;推动本地AI产业的发展。本文将带你了解目前不完全统计到的苏州 成都 杭州三地AI…

【Vulnhub系列】Vulnhub_pipe 靶场渗透(原创)

【Vulnhub系列靶场】Vulnhub-pipe 靶场渗透 原文转载已经过授权 原文链接&#xff1a;Lusen的小窝 - 学无止尽&#xff0c;不进则退 (lusensec.github.io) 一、环境配置 1、解决IP扫描不到问题 2、打开虚拟机&#xff0c;并修改网络连接模式为【NAT】即可 二、信息收集 1…

Python实战——轻松实现动态网页爬虫(附详细源码)

大家好&#xff0c;我是东眠的鱼&#xff0c;专注原创&#xff0c;致力于用浅显易懂的语言分享爬虫、数据分析及可视化等干货&#xff0c;希望人人都能学到新知识。<文末附带精品籽料哦&#xff0c;也可以和博主一起学Python呀&#xff01;> 项目背景 有同学自学爬虫时…

前端vue3 巧妙的checkbox 选中框样式

我们 做前端页面交互效果的时候 我们会使用到 checkbox 复选框 做一些交互的效果 我是用的是 nut-ui 组件库中的 checkbox 组件 类似于这样的选中效果 假如 二选一的那种 可以 这样写 交互好看 而不是单纯的 checkbox 框 这里我就不使用 gif 图片了 大家应该都可以看懂的 …

A股继续震荡下行,成交量继续一蹶不振。

A股继续震荡下行&#xff0c;成交量继续一蹶不振。今天的A股&#xff0c;让人揪心不已&#xff0c;你们知道是为什么吗&#xff1f;盘面上出现1个重要信号&#xff0c;一起来看看&#xff1a; 1、今天两市低开低走&#xff0c;向下回补了2867点的缺口&#xff0c;让人揪心不已。…

计算机毕业设计选题推荐-基于司机信用评价的货运管理系统-Java/Python项目实战

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

CUDA_Occupancy_Calculator计算公式

CUDA_Occupancy_Calculator计算公式

6 Java的基本程序设计结构(基本语法5)- 面向对象进阶

文章目录 面向对象进阶一、 static 静态1 静态变量(1)基本定义和用法(2)静态变量内存图2 静态方法(1)基本定义和用法(2)工具类练习:按下面需求写一个工具类3 static注意事项4 重新认识main方法二、继承1 继承的概念2 继承的特点3 继承到底能继承父类中的哪些内容?4 继…

leetcode日记(63)颜色分类

感觉就是排序问题&#xff1f;我使用的是时间复杂度比较高的简单粗暴排序法&#xff0c;时间复杂度O&#xff08;n^2&#xff09;。 class Solution { public:void sortColors(vector<int>& nums) {int nnums.size();for(int i0;i<n;i){for(int ji1;j<n;j){if…

泛微OA BPM 全程数字化业务介绍、管理、财务一体化 数据业务架构图 上帝视角 02

III.泛微业务、管理、财务一体化过程介绍 IV.低代码平台及典型场景搭建过程 V.全程数字化运营平台价值总结 档案管理 档案接收,四性检测,快速可查找 重要:档案管理:架构总图 业务应用都在一个平台,确保档案实现100%归档 自动化档案采集:自动接收各类档案,如文书档案、合…

速通JS模块化规范

目录 1模块化概述 1.1什么是模块化&#xff1f; 1.2为什么需要模块化&#xff1f; 2有哪些模块化规范&#xff1f; 3导入与导出的概念 4CommonJS 规范 4.1初步体验 4.2导出数据 4.3导入数据 4.4扩展理解 4.5浏览器端运行 5ES6 模块化规范 5.1初步体验 5.2Node 中运…

操作系统课程设计:(JAVA)进程管理系统(附源码zip,jdk11,IDEA Ultimate2024 )

一.题目要求描述 本设计的目的是加深对进程概念及进程管理各部分内容的理解&#xff1b;熟悉进程管理中主要数据结构的设计及进程调度算法、进程控制机构、同步机构及通讯机构的实施。要求设计一个允许n个进程并发运行的进程管理模拟系统。 该系统包括有简单的进程控制、同步与…

一行代码教你使用Python制作炫酷二维码

二维码&#xff0c;我们日常生活中随处可见的编码方式&#xff0c;凭借其方便快捷的信息承载能力&#xff0c;已经渗透到各行各业。 MyQR 的介绍 MyQR 是一个 Python 库&#xff0c;用于生成自定义二维码&#xff0c;包括带有 Logo、彩色和动态的二维码。它基于 Python 的 qr…

【基础篇】Docker 镜像管理 THREE

嘿&#xff0c;小伙伴们&#xff01;我是小竹笋&#xff0c;一名热爱创作的工程师。在上一篇文章中&#xff0c;我们探讨了 Docker 的架构与关键组件。今天&#xff0c;让我们一起深入了解一下 Docker 镜像管理的相关知识吧&#xff01; &#x1f4e6; 创建和管理镜像 镜像是…

Qt程序移植至Arm开发板

环境准备&#xff1a; 系统调试工具SecureCRT SecureCRT 是一款支持 SSH 协议的终端仿真软件&#xff0c;可通过串口或网口对评估板系统信息进行查看、对评估板系统进行调试等。 SecureCRT的安装破解 [详细过程2024]-CSDN博客https://blog.csdn.net/2301_76659937/article/det…

2-50 基于matlab的遗传模拟退火算法的聚类算法

基于matlab的遗传模拟退火算法的聚类算法&#xff0c;以模糊K-均值聚类算法为基础&#xff0c;对各样本的聚类中心进行优化&#xff0c;输出聚类可视化结果。聚类类别数可自由输入。程序已调通&#xff0c;可直接运行。 2-50 遗传模拟退火算法的聚类算法 - 小红书 (xiaohongshu…

【源码阅读】Redisson lock源码

Redisson 加锁非常简单&#xff0c;还支持 redis 单实例、redis 哨兵、redis cluster、redis master-slave 等各种部署架构 RLock lock redisson.getLock("cyk-test"); lock.lock(); lock.unlock(); 底层原理 加锁机制 废话不多说&#xff0c;直接看源码&#xf…