【排序算法——数据结构】

文章目录

  • 排序
    • 排序的基本概念
    • 1.插入排序
    • 2.希尔排序
    • 3.冒泡排序
    • 4.快速排序
    • 5.简单排序
    • 6.堆排序
    • 7.归并排序
    • 8.基数排序
    • 8.外部排序
    • 9.败者树
    • 10.置换选择排序

排序

排序的基本概念

排序,就是重新排列表中的元素,使表中的元素满足按关键字有序的过程
评价指标算法的稳定性,关键字相同的两个元素,在排序前后的相对位置不变,则称这个排序算法是稳定的,否则是不稳定的。
时间复杂度,空间复杂度
排序算法内部排序目一关注如何使算法的时间复 杂度和空间复杂度更低
外部排序还要关注如何使读/写磁盘次数更少

1.插入排序

在这里插入图片描述

折半查找找到应插入的位置,仅适用于顺序表
注意:一直到low> high时才停止折半查找。当mid所指元素等于当前元素时,应继续令low=mid+1,以保证"稳定性”。最终应将当前元素插入到low所指位置(即high+1)
在这里插入图片描述

在这里插入图片描述
比起直接插入排序,只减少了比较关键字的次数,时间复杂度仍是O(n2)

2.希尔排序

算法思想先追求表中元素部分有序,再逐渐逼近全局有序
先将待排序表分割成若干形如L([i,i+d.,i+2d…i+kd]的”特殊"子表,对各个子表分别进行直接插入排序。缩小增量d,重复上述过程,直到d= 1为止。
.
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

3.冒泡排序

算法思想从后往前(或从前往后)两两比较相邻元素的值,若为逆序(即A[i-1]>A[i]) ,则交换它们,直到序列比较完。称这样过程为“- 趟”冒泡排序。最多只需n-1趟则交换它们,直到序列比较完.称这样过程为“-趟”冒泡排序.最多只需n-1趟排序。

每一趟排序都可以使一个元素移动到最终位置, 已经确定最终位置的元素在之后的处理中无需再次对比。

如果某一趟排序过程中未发生“交换”,则算法可以提前结束。

每次交换都要移动元素三次

在这里插入图片描述
在这里插入图片描述

4.快速排序

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.简单排序

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

6.堆排序

堆排序(Heap Sort)是一种基于二叉堆数据结构的排序算法。它利用了堆的性质:在一个最大堆(或最小堆)中,父节点的值总是大于等于(或小于等于)其子节点的值。

堆排序的基本思想是:

  1. 将待排序的序列构建成一个最大堆(或最小堆)。
  2. 取出堆顶元素(最大值或最小值),将其与堆的最后一个元素交换。
  3. 缩小堆的范围,对剩余的元素重新调整为最大堆(或最小堆)。
  4. 重复步骤 2 和步骤 3,直到堆的大小为 1。

堆排序的时间复杂度为 O(nlogn),其中 n 为要排序的元素个数。由于堆排序是一种原地排序算法,空间复杂度为 O(1),因此它在空间利用上相对较好。但是,堆排序是一种不稳定的排序算法,因为在构建堆的过程中会破坏相同元素之间的相对顺序。

堆排序的实现通常分为两个步骤:建堆和排序。建堆阶段的时间复杂度为 O(n),排序阶段的时间复杂度为 O(nlogn)。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

7.归并排序

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

8.基数排序

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

8.外部排序

外存与内存之间的数据交换
在这里插入图片描述
外部排序:
1.数据元素太多,无法- -次全部读入内存进行排序
2.若要进行k路归并排序,则需要在内存中分配k个输入缓冲区和1个输出缓冲区
3.步骤生成r个初始归并段(对L个记录进行内部排序,组成一个有序的初始归并段)
进行S趟k路归并, S=[logkr]- k越大, r越小,归并趟数越少,读写磁盘次数越少目
4.如何进行k路归并
把k个归并段的块读入k个输入缓冲区
用“归并排序”的方法从k个归并段中选出几个最小记录暂存到输出缓冲区中
每当一个输入缓冲区为空时,立即输入下一块待排数据
当输出缓冲区满时,写出外存
优化思路
多路归并
需要增加相应的输入缓冲区
每次从k个归并段中选一个最小元素需要 (k-1) 次关键字对比
采用多路归并可以减少归并趟数,从而减少磁盘I/O (读写)次数

减少初始归并段数量
若能增加初始归并段长度,则可减少初始归并段数量r
按照本节课介绍的方法生成的初始归并段,若共有N个记录,内存工作区可以容
纳L个记录,则初始归并段数量r=N/L

9.败者树

使用k路平衡归并策略,选出一个最小元素需要对比关键字(k-1) 次,导致内部.
归并所需时间增加-----可以用败者树解决!
败者树一可视为一 棵完全_ =叉树(多了一个头)。k个叶结点分别是当前参加比
什么是败者树
较的元素,非叶子结点用来记忆左右子树中的“失败者”,而让胜者往上继续进
行比较,-直到根结点

原理
每个叶子结点对应一个归并段
分支结点记录失败败者来自哪个归并段
根节点记录冠军来自哪个归并段
性能分析
对于k路归并,第一次构造败者树需要对比关键字k-1次
有了败者树,选出最小元素,只需对比关键字[log2 k]次

10.置换选择排序

若共有N个记录,内存工作区可以容纳L个记录,则初始归并段数量r=N/L-
可用“置换选择排序"进-步减少初始归并数量
设初始待排文件为FI,初始归并段输出文件为FO,内存工作区为WA, FO和WA
的初始状态为空,WA可容纳w个记录。置换选择算法的步骤如下
1.从FI输入w个记录到工作区WA
2.从WA中选出其中关键字取最小值的记录,记为MINIMAX记录
3.将MINIMAX记录输出到FO去
4.若FI不空,则从FI输入下一个记录到WA中
5.从WA中所有关键字比MINIMAX记录的关键字大的记录中选出最小关键字记
录,作为新的MINIMAX记录
6.重复3-5,直至在WA中选不出新的MINIMAX记录为止,由此得到一个初始归
并段,输出一个归并段的结束标志到FO中去
7.重复2-6,直至WA为空,由此得到全部初始归并段
在这里插入图片描述
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Git 如何合并多个连续的提交

我平常的编程喜欢是写一段代码就提交一次,本地一般不攒代码,生怕本地有什么闪失导致白干。但这样就又导致一个问题:查看历史日志时十分不方便,随便找一段提交可以看到: > git log --oneline 8f06be5 add 12/qemu-h…

LeetCode-142. 环形链表 II【哈希表 链表 双指针】

LeetCode-142. 环形链表 II【哈希表 链表 双指针】 题目描述:解题思路一:快慢指针 判断是否有环见解题思路二:set()解题思路三:0 题目描述: 给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如…

JavaScript中什么叫深拷贝?

在 JavaScript 中,深拷贝指的是创建一个新的对象,这个新的对象与原始对象完全独立,没有任何共享的属性或者数据,它们不共享同一块内存地址。深拷贝会复制原始对象的所有属性和嵌套对象的所有属性,包括嵌套对象中的属性…

数据结构之单链表实现(JAVA语言+C语言)

一、理论 1 单链表结构 2 增、删、查 、改思路 (增)直接添加放到最后即可。按顺序添加:找到要修改的节点的前一个节点,插入新节点()。(改)要修改的节点修改内容即可。(…

Python(乱学)

字典在转化为其他类型时,会出现是否舍弃value的操作,只有在转化为字符串的时候才不会舍弃value 注释的快捷键是ctrl/ 字符串无法与整数,浮点数,等用加号完成拼接 5不入??? 还有一种格式化的方法…

VScode-配置文件

导入配置文件 ShiftCtrlp 输入: import 选择文件 点击确认 导出配置文件 设置选择导出 确认导出 保存为本地文件 保存文件

浏览器工作原理与实践--WebAPI:XMLHttpRequest是怎么实现的

在上一篇文章中我们介绍了setTimeout是如何结合渲染进程的循环系统工作的,那本篇文章我们就继续介绍另外一种类型的WebAPI——XMLHttpRequest。 自从网页中引入了JavaScript,我们就可以操作DOM树中任意一个节点,例如隐藏/显示节点、改变颜色、…

全氟己酮气体灭火装置厂家爆料:自动灭火贴好用吗?

近些年来,自动灭火贴备受瞩目。好奇的朋友注意了,今天小编特意请教了国内知名全氟己酮气体灭火装置厂家,为大家解答一下自动灭火贴好用吗?自动灭火贴有什么优缺点? 不知道大家有没有好奇过,为什么下图这个…

Qt使用opencv打开摄像头

1.效果图 2.代码 #include "widget.h"#include <QApplication>#include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp>#include <QImage> #include <QLabel> #incl…

Oracle基础-PL/SQL编程 备份

1、PL/SQL简介 PL/SQL块结构 约定&#xff1a;为了方便&#xff0c;本文后面把PL/SQL简称PL。 PL程序都是以块&#xff08;BLOCK&#xff09;为基本单位&#xff0c;整个PL块分三部分&#xff1a;声明部分&#xff08;使用DECLARE开头&#xff09;、执行部分(以BEGIN开头)和异…

c#仿ppt案例

画曲线 namespace ppt2024 {public partial class Form1 : Form{public Form1(){InitializeComponent();}//存放所有点的位置信息List<Point> lstPosition new List<Point>();//控制开始画的时机bool isDrawing false;//鼠标点击开始画private void Form1_MouseD…

荣誉 | 人大金仓连续三年入选“金融信创优秀解决方案”

3月28日&#xff0c;由中国人民银行领导&#xff0c;中国金融电子化集团有限公司牵头组建的金融信创生态实验室发布“第三期金融信创优秀解决方案”&#xff0c;人大金仓新一代手机银行系统解决方案成功入选&#xff0c;这也是人大金仓金融行业解决方案连续第三年获得用户认可。…

拌合楼管理软件开发(十三) 对接耀华XK3190-A9地磅(实战篇)

前言: 实战开整 目前而言对于整个拌合楼管理软件开发,因为公司对这个项目还处于讨论中,包括个人对其中的商业逻辑也存在一些质疑,都是在做一些技术上的储备.很早就写好了串口与地磅对接获取代码,也大概知道真个逻辑,这次刚好跟库区沟通,远程连接到磅房电脑,开始实操一下. 一、地…

Debian linux版本下运行的openmediavault网盘 千兆网卡升级万兆

一、适用场景 1、使用vmware ESXi虚拟化平台运行多种不同应用服务器时&#xff0c;其中网盘服务器采用开源的openmediavault搭建&#xff1b; 2、将老专业服务器升级千兆网为万兆网&#xff1b; 3、需要转移的数据量大的企业或用户&#xff1b; 4、从服务器到服务器的数据转移…

wpsword求和操作教程

wpsword求和怎么操作&#xff1a; 1、首先&#xff0c;单纯的数据是无法求和的&#xff0c;所以我们必须要“插入”一个“表格” 2、接着将需要求和的数据填入到表格中。 3、填完后&#xff0c;进入“布局”选项卡。 4、然后打开其中的“公式” 5、在其中选择求和公式“SUM”并…

DVWA-File Inclusion通关教程-完结

DVWA-File Inclusion通关教程-完结 文章目录 DVWA-File Inclusion通关教程-完结页面功能LowMediumHighImpossible 页面功能 点击页面上提供的三个页面&#xff0c;单击这些文件就会显示其执行内容&#xff0c;同时发现提交是由GET方式进行&#xff0c;使用page参数传参。 …

单元测试——Junit (断言、常用注解)

单元测试 Junit单元测试框架 使用 断言测试 使用Assert.assertEquals(message, 预期值, 实际值); 这段代码是用于在测试中验证某个方法的返回值是否符合预期。其中&#xff0c;"方法内部有bug"是用于在断言失败时显示的提示信息。4是预期的返回值&#xff0c;index…

VsCode正确解决vue3+Eslint+prettier+Vetur的配置冲突

手把手教你VsCode正确解决vue3EslintprettierVetur的配置冲突 VsCode正确解决vue3EslintprettierVetur的配置冲突Eslint文档查看和修改规则&#xff1a;step1&#xff1a;首先快速浏览下规则简要setp2: ctrlF 搜索你要配置规则的英文名&#xff0c;例如attributesetp3: 修改配置…

JavaScript 对象管家 Proxy

JavaScript 在 ES6 中&#xff0c;引入了一个新的对象类型 Proxy&#xff0c;它可以用来代理另一个对象&#xff0c;并可以在代理过程中拦截、覆盖和定制对象的操作。Proxy 对象封装另一个对象并充当中间人&#xff0c;其提供了一个捕捉器函数&#xff0c;可以在代理对象上拦截…

精确到SKU的数据监测对于控价有什么意义

品牌在做控价时&#xff0c;首先要对电商平台上的数据进行价格监测&#xff0c;监测可以理解为对数据的采集&#xff0c;常见的采集方式有关键词采集、店铺采集、链接采集&#xff0c;但指定SKU数据的采集较少见到&#xff0c;这是因为不同店铺对链接中SKU的描述不尽相同&#…