【数据结构与算法】七大排序算法(上)

【数据结构与算法】七大排序算法(上)

🥕个人主页:开敲🍉

🔥所属专栏:数据结构与算法🍅

🌼文章目录🌼

1. 排序的概念及应用

    1.1 排序的概念

  1.2 排序的应用

    1.3 常见排序算法

2. 常见排序算法的实现

    2.1 插入排序

    2.1.1 直接插入排序

    2.1.2 希尔排序

    2.2 选择排序

      2.2.1 直接选择排序

      2.2.2 堆排序

1. 排序的概念及应用
    1.1 排序的概念

  排序所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。
  稳定性假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的。
  内部排序数据元素全部放在内存中的排序。
  外部排序数据元素太多不能同时放在内存中,根据排序过程的要求不断地在内外存之间移动数据的排序。

  1.2 排序的应用

  

    1.3 常见排序算法

  冒泡排序动图演示:

    

直接插入排序动图演示:

希尔排序动图演示:

  希尔排序本质上还是插入排序,只不过在插入排序的基础上进行了优化。希尔排序在进行直接插入排序前会进行预排序,具体何为预排序下面会讲。

选择排序动图演示:

堆排序动图演示:

  

快速排序动图演示:

归并排序动图演示:

2. 常见排序算法的实现
    2.1 插入排序

  基本思想:直接插图排序是一种简单的插入排序法,其基本思路是:把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列 。

  在实际生活中,我们打扑克牌时就用到了直接插入排序的方法:

    2.1.1 直接插入排序

  当插入第i(i>=1)个元素时,前面的array[0],array[1],…,array[i-1]已经排好序,此时用array[i]的排序码与array[i-1],array[i-2],…的排序码顺序进行比较,找到插入位置即将array[i]插入,原来位置上的元素顺序后移。

  直接插图排序的特性总结:

  ① 元素集合越接近有序,直接插入排序算法的时间效率越高

  ② 时间复杂度:O(N^2)

  ③ 空间复杂度:O(1),它是一种稳定的排序算法

  ④ 稳定性:稳定

    2.1.2 希尔排序

  希尔排序法又称缩小增量法。希尔排序法的基本思想是:先选定一个整数,把待排序文件中所有记录分成个组,所有距离为的记录分在同一组内,并对每一组内的记录进行排序。然后,取,重复上述分组和排序的工作。当到达=1时,所有记录在统一组内排好序。

希尔排序的特性总结:
 希尔排序是对直接插入排序的优化。
② 当gap > 1时都是预排序,目的是让数组更接近于有序。当gap == 1时,数组已经接近有序的了,这样就会很快。这样整体而言,可以达到优化的效果。我们实现后可以进行性能测试的对比。
③ 希尔排序的时间复杂度不好计算,因为gap的取值方法很多,导致很难去计算,因此在好些树中给出的希尔排序的时间复杂度都不固定:

    2.2 选择排序

  基本思想:每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完 。

      2.2.1 直接选择排序

  ① 在元素集合array[i]--array[n-1]中选择关键码最大(小)的数据元素

  ② 若它不是这组元素中的最后一个(第一个)元素,则将它与这组元素中的最后一个(第一个)元素交换

  ③ 在剩余的array[i]--array[n-2](array[i+1]--array[n-1])集合中,重复上述步骤,直到集合剩余1个元素

  直接选择排序特性总结:

  ① 直接选择排序思考非常好理解,但是效率不是很好。实际中很少使用

  ② 时间复杂度:O(N^2)

  ③ 空间复杂度:O(1)

  ④ 稳定性:不稳定

      2.2.2 堆排序

  堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。它是通过堆来进行选择数据。需要注意的是排升序要建大堆,排降序建小堆。

  

  (堆排序具体实现在:【数据结构与算法篇】二叉树顺序结构及实现-CSDN博客 中,感兴趣的可以自行学习了解~)

  堆排序的特性总结:

  ① 堆排序使用堆来选数,效率就高了很多

  ② 时间复杂度:O(N*logN)

  ③ 空间复杂度:O(1)

  ④ 稳定性:不稳定

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

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

相关文章

开源博客项目Blog .NET Core源码学习(23:App.Hosting项目结构分析-11)

本文学习并分析App.Hosting项目中后台管理页面的标签管理页面、轮播图维护页面。 标签管理页面 标签管理页面用于显示、检索、新建、编辑、删除标签数据,以便在前台页面的首页及文章专栏等页面显示标签数据。标签管理页面附带一新建及编辑页面,以支撑新…

如同“水生态”的存储引擎|OceanBase数据转储合并技术解读(一)

本系列文章主要围绕 OceanBase数据库存储引擎中的转储合并进行解读,涉及到数据存储、转储合并、数据校验等方面的内容,旨在让读者了解OceanBase数据库的存储引擎中与转储合并有关的各种概念,帮助读者更好地理解OceanBase数据库的存储技术原理…

基于STM32实现智能饮水机控制系统

目录 引言环境准备智能饮水机控制系统基础代码示例:实现智能饮水机控制系统 温度传感器数据读取水泵和加热器控制水位传感器数据读取用户界面与显示应用场景:家庭和办公室的智能饮水管理问题解决方案与优化收尾与总结 1. 引言 本教程将详细介绍如何在S…

关于pdfbox读取pdf

最近,想着将pdf的文件进行读取其内容,发现了一个比较好用的依赖pdfbox。目前使用这个依赖,进行实现一个简单实例,如果之后需要使用到更深的了解,会进行更新。这里提醒一下:jdk8尽量采用pdfbox3.x版本。 对…

Linux一键安装Docker、kkfileviewer

Linux一键安装Docker、kkfileviewer 一、安装docker 安装docker脚本 vi initDocker.sh脚本内容 #安装前先更新yum,防止连接镜像失败 yum -y update#卸载系统之前的docker(可选择,我这里直接注释了) #yum remove docker docker…

香橙派KunpengPro测评之使用C语言操控40pin引脚

香橙派KunpengPro测评之使用C语言操控40pin引脚 香橙派KunpengPro介绍香橙派实物图香橙派登录界面香橙派KunpengPro的登录界面香橙派KunpengPro的原始桌面香橙派KunpengPro内安装了VScode等软件香橙派KunpengPro的终端 香橙派硬件参数核心性能图形与显示接口丰富性扩展与兼容性…

十四天学会Vue——Vue核心(理论+实战)上篇(第一天)

一、Vue核心(上篇) 热身tops:选取开发模式 ①用于开发模式 我们只需要知道 我们是开发模式,开发模式他会跟你提示代码出现错误的地方以及出错原因,而生产模式比较简洁。 ②用于生产模式 1.1 new Vue()实例 了解Vue&a…

数据库语法树优化

目录 一、σ、π、⋈ 1.选择σ 2.投影π 3.连接⋈ 二、 构建语法树 ① 解读sql语句 ② 写出关系代数表达式 ③ 画出语法树 三、优化语法树 四、练习 语法树优化方法 一、σ、π、⋈ 1.选择σ 选择就是在关系R中选择满足给定条件的诸元组。 通过条件SdeptIS选择出系别…

基于香橙派搭建家庭网盘

一、概述 家庭网盘是一种用于家庭用户的在线存储和文件共享服务。它允许家庭成员在云端存储、同步和分享照片、视频、文档等文件,方便快捷地访问和管理个人和家庭数据。家庭网盘通常提供安全可靠的数据存储和备份功能,保障用户数据的安全性。此外&#x…

一文解决弹窗交互设计难题,轻松上手

弹窗交互的分类 我们每天所说的弹出窗口是一个非常笼统的概念。我们习惯性地称所有的对话框、浮层和提示条为弹出窗口。事实上,弹出窗口可以分为两种类型:模态弹出框和非模态弹出框。在 UI 在设计中,当它迫使用户与之交互时,我们…

【算法】【二叉树,DFS,哈希集合,分类讨论】力扣1110. 删点成林

1110. 删点成林 文章目录 【算法】力扣【二叉树,DFS,哈希集合,分类讨论】1110. 删点成林题目描述示例 1:示例 2: 输入输出示例解释思路解析核心思想算法步骤复杂度分析 代码实现总结 【算法】力扣【二叉树&#xff0c…

ElasticSearch - 删除已经设置的认证密码(7.x)

文章目录 Pre版本号 7.x操作步骤检查当前Elasticsearch安全配置停止Elasticsearch服务修改Elasticsearch配置文件删除密码重启Elasticsearch服务验证配置 小结 Pre Elasticsearch - Configuring security in Elasticsearch 开启用户名和密码访问 版本号 7.x ES7.x 操作步骤 …

马斯克xAI融资60亿美元,宣布打造世界第一超算中心,10万张H100GPU

昨天,埃隆马斯克的xAI初创公司宣布获得60亿美元的巨额融资,主要用于打造一台巨大的超级计算机,马斯克称之为“超级计算工厂”。 从创立OpenAI到如今的xAI,技术和算力的发展历经了几个时代,但似乎马斯克的吸金能力一直…

代码随想录算法训练营day21|530.二叉搜索树的最小绝对值差、501.二叉搜索树中的众数、236.二叉树的最近公共祖先

二叉搜索树的最小绝对值差 递归法 首先需考虑这是一个二叉搜索树,在中序遍历后的结果为从小到大的一个序列,寻找二叉搜索树的最小绝对值差,只需比较一个节点与之后的差值即可。在遍历的过程中,我们需要一个节点保存前节点…

短道速滑短视频:四川京之华锦信息技术公司

短道速滑短视频:冰雪激情的视觉盛宴 随着冬奥会的热度不断攀升,短道速滑作为其中一项紧张刺激、充满观赏性的运动,受到了越来越多人的关注。而在社交媒体和短视频平台的助力下,短道速滑短视频成为了人们了解、欣赏这项运动的新窗…

vxe-form-design 表单设计器的使用

vxe-form-design 在 vue3 中表单设计器的使用 查看官网 https://vxeui.com 安装 npm install vxe-pc-ui // ... import VxeUI from vxe-pc-ui import vxe-pc-ui/lib/style.css // ...// ... createApp(App).use(VxeUI).mount(#app) // ...使用 github vxe-form-design 用…

Python在忘mysql密码后该如何重新连mysql

步骤一 先到mysql的bin目录下 步骤二 用mysqld delete mysql 把之前的库删了 步骤三 通过管理员模式进去后 用命令mysqld --skip-grant-tables越过验证 再输入mysql -u root 直达账户 步骤四 用FLUSH PRIVILEGES; ALTER USER rootlocalhost IDENTIFIED BY new_password; 指…

Echarts x轴坐标二级分组

在使用echarts 封装组件的时候,偶尔会遇到需要x轴坐标进行二层分组的需求。那么如何对echarts 进行二层分组呢,有以下几个步骤: 仅介绍二层分组的逻辑。有兴趣的可以进行三层延伸。 1,修改echarts Options 中xAxis 的配置。 此…

【机器学习】K-近邻算法(KNN)全面解析

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 K-近邻算法(KNN)全面解析概述1. 基本概念与原理1.1 KNN算…

Excel表格保护密码遗忘怎么办?三秒钟破解密码,轻松解锁!

在我们的日常工作中,Excel表格是一个非常实用的工具,但在某些情况下,我们可能会遇到密码忘记的问题,或者在尝试打开或删除文件时被锁定。别担心,这里有三个简单的解决方法来帮助您解决问题。 一、尝试默认密码或常见密…