冒泡排序、插入排序、希尔排序、选择排序

一、排序协议的定义

在博客的开头的,我们先给出排序协议的定义。因为我们本篇博客含有多种排序方式,为了使每种排序方法对外调用方式一致,我们需要定义一个排序的相关协议。所有排序的相关类都必须遵循该协议,让此协议来定义具体的排序类对外的调用方式。

下方的SortType协议就是我们定义的排序类型的协议。其中的sort()方法是遵循该协议的类必须要实现的方法。sort()函数的参数是一个含有Int类型的数组,该数组就是要排序的数组。该方法的返回值是已经被排好序的数组。具体代码如下所示。

 二、冒泡排序

接下来我们来聊一下冒泡排序,冒泡排序就像其名字一样,还是比较生动的。在冒泡排序过程中会将数组分成两部分,一部分是已经有序的数列,一部分是无序的数列。无序数列中不断的将其中最小的值往有序序列中冒泡,泡冒完后,我们的序列就创建好了。本部分,我们将要给出冒泡排序的示意图,已经相应的代码实现。

1、冒泡排序示意图

下方就是第一轮冒泡的具体过程,我们要对[62, 88, 58, 47, 62, 35, 73, 51, 99, 37, 93]序列进行冒泡排序。经过第一轮的冒泡后,该序列中最小的值35被冒到了数列的最前方。因为冒泡的过程是挨个比较已经交换的过程。元素状态我们的泡中是93,93与前一个值37进行比较,发现37要小于93,所以将泡中的值改成37,并往前移动。紧接着37在与前面的99比较,发现泡中的值要小,此刻不更新泡中的值并往前移动一个格。以此类推,无序序列中最小的值就会被冒到序列的起始位置。

每轮冒泡都会从无序序列中冒出那个最小的值,所以经过n(数列有n个值)次冒泡后,我们的数列就是有序的了。冒泡过程中的比较与交换的具体步骤如下所示:

2.代码实现

根据上述示意图,我们很容易给出下方的代码。下方就是冒泡排序的代码,BubbleSort这个类就是冒泡排序所对应的类,此类为了统一对外的调用方式,所以必须要遵循我们上一部分所定义的SortType协议。

说白了,冒泡的过程就是不断比较和交换的过程,如果前一个值比后一个值要大,那么就要进行交换了

3、运行结果

下方代码就是上述BubbleSort类所运行的具体结果。排序结果中详细的打印了冒泡排序在每一轮冒泡中每一步要做的事情,具体如下所示。

三、插入排序

插入排序算是比较好理解的排序方式,插入排序也是将要排序的数列分为两部分,前半部分是已经排好序的,后半部分则是无序的。插入排序中的插入是指“取出无序数列中第一个值,插入到有序数列中相应的位置”。其实这个插入过程也是不断比较和交换的过程。

1、插入排序示意图

下方就是插入排序的示意图,红色部分是有序数列,而绿色部分是无序数列。每一轮插入都会取出无序数列中的第一个元素插入到有序数列中,这个插入的过程其实就是一个比较交换的过程,如果要插入的值比前面的值要小,就要交换,直到不能交换为止。下方就是插入排序的过程。具体如下所示:

2、代码实现

有了上述的示意图,给出相应的代码实现并不困难。代码的核心思想就是通过循序不断从无序数列中取出值,然后循环遍历有序数列寻找合适的插入点。在下方中有两个循环嵌套,外层循环负责不断从无序序列中取值,然后通过内层循环将外层循环取出的值插入到有序数列中相应的位置,具体如下代码所示:

3、运行结果

下方是运行结果的截图,该运行结果其实就是插入排序的详细过程。每一轮插入的过程就是有序序列增加,无序序列减少的过程。下方就是插入过程的详细信息。

四、希尔排序

因为这个排序是一个叫希尔的人发明的,所以就叫希尔排序了。其实希尔排序是插入排序的升级版, 希尔排序根据其排序的特点又叫做缩小增量排序。希尔排序的大体步骤就是先将无序序列按照一定的步长(增量)分为几组,分别将这几组中的数据通过插入排序的方式将其进行排序。然后缩小步长(增量)分组,然后将组内的数据再次进行排序。知道增量为1位置。经过上述这些步骤,我们的序列就是有序的了。其实上述的插入排序就是增量为1的希尔排序,下方会给出相应的示意图以及代码实现。

1.希尔排序示意图

下方就是希尔排序的详细步骤,接下来我们将会对每一步进行详细的解说。如下所示:

  • (1)、首先按照增量进行分组,因为我们要排序的数列有11个,增量初始值是step = 11 / 2 = 5。也就是按照增量为5的步长对数组进行分组。在下方第一步中就是按照增量为5的方式进行分组的。我们将为一组的元素使用直线进行相连,分完组后,我们就将组内中的元素进行插入排序。
  • (2)、将上一步使用的增量进行缩小,也就是本步骤的step = 5 / 2 = 2。 本部分,就要按照2的增量将上一步排序后的数组进行分组,然后再次将每个组内的数据进行插入排序。
  • (3)、再次缩小增量,此刻step = 2 / 2 = 1, 当增量为1时,其实就是我们上一部分的插入排序。将整个数组进行插入排序,然后我们的数组就是有序的了。

具体示意图如下所示:

2、希尔排序的代码实现

根据上述的步骤,然后再结合着插入排序的代码,给出希尔排序相应的代码并不困难。就是将插入排序的步长从1修改成我们每次生成的步长即可,每次增量排序完毕后,我们要对增量按照相应的规则进行缩小即可。下方就是希尔排序的代码实现。

在下方代码中,最外层循环负责增量的生成和缩减,里边的双重循环就是我们之前我们插入排序的代码,不步长要使用我们希尔排序生成的step,具体代码如下所示:

3、运行结果

下方就是Shell排序的运行结果,从下方结果中我们不难看出增量是逐渐减小的。下方的输出结果结合着本部分第一部分的示意图看更为直观一些。

 五、选择排序

接下来来聊聊选择排序,选择排序也是比较好理解的。在选择排序过程中,数组仍然被分作有序和无序两部分。而选择排序中的“选择”是指不断从无序序列中选择最小的值放入到有序序列的最后的位置,换句话说就是从现有的无序序列中找出那个最小的值,然后与无序序列的第一个值进行交换,然后缩小无序序列的范围即可。因为有序序列的最后一个值与无序序列的第一个值紧挨着,交换后,这个无序序列中的第一个值就成了有序序列的最后一个值。重复这个选择的过程,我们的数组就会变得有序。下方将会给出详细的示意图以及相应的代码实现。

1.选择排序示意图 

下方就是简单选择排序的部分步骤,只需要重复下方的步骤就可以通过选择排序将我们的数组变成有序的序列。下方是对下方步骤的详细介绍:

  • 初识状态下,我们整个数组就是无序的,从整个数组中我们找到了最小的元素35,其下标为5。然后将35与无序序列第一个元素62进行交换。交换后,有序序列中就有了一个值:35,而无序序列中就少了一个值:35。无序序列中的第一个值也就是变成了88。
  • 再次从无序序列中选择那个最小的值。于是乎我们又找到了37,然后让37与88进行交换。有序序列就成了{35,37}。
  • 再次从无序序列中选择最小的那个值,经过查找我们找到了47,然后将47与58进行交换。此刻有序序列就成了{35, 37, 47}。
  • 重复的从无序序列中选择最小的值进行交换......

2.选择排序具体代码实现

有了上述选择的示意图,根据思路敲代码。下方就是选择排序的具体代码实现。代码实现起来还是比较简单的,就是通过一个循环,不断的从无序序列中选出那个最小的值与无序序列中的第一个值进行交换即可。下方第一个框中就是从无序序列中查找最小的那个值的代码,第二个框就是交换的过程。如下所示:

3、运行结果

与上几个排序一样,我们输出的运行结果就是选择排序的详细的过程。下方就是选择排序的详细过程,如下所示:

六、测试用例

在博客要结尾的部分,我们仍然会给出本篇博客所使用的测试用例。下方就是本篇博客所使用的测试用例。上述的运行结果就是下方我们测试用例的输出结果。虽然输出的结果不同,但是我们用的都是一个测试函数,只是传入的排序对象不同。这也就是我们在程序的第一部分为什么要给出相应的协议定义的原因。测试用例如下所示:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

快速实现一个分布式定时器

定时器(Timer)是一种在业务开发中常用的组件,主要用在执行延时通知任务上。本文以笔者在工作中的实践作为基础,介绍如何使用平时部门最常用的组件快速实现一个业务常用的分布式定时器服务。同时介绍了过程中遇到问题的一些解决方案…

Android AIDL的使用(配源码)

零、完整源代码 链接: https://github.com/jx0260/TestGradle 一、创建AIDL文件 // IShopAidlInterface.aidl package com.example.testgradle;// Declare any non-default types here with import statementsinterface IShopAidlInterface {String getProductInfo(int prod…

【2023最新教程】一文3000字从0到1教你做app自动化测试(保姆级教程)

一、什么是App自动化?为什么要做App自动化? App自动化是指给 Android或iOS上的软件应用程序做的自动化测试。手工测试和自动化测试的对比如下: 手工测试优势:不可替代、发现更多bug、包含了人的想象力与理解力。 注意&#xff0c…

迅为iTOP-RK3588开发板Android12源码定制开发kernel开发

内核版本是 5.10.66 版本,内核默认的配置文件是 3588-android12/kernel-5.10/arch/arm64/configs/rockchip_defconfig 如果我们要使用图形化界面配置内核,操作方法如下所示: 方法一: 1 首先将默认的配置文件 rockchip_defconf…

博客系统测试用例设计之自动化测试

测试用例设计之自动化测试 🌷 一 测试用例设计🌺 1 功能测试🌸 (1)登录功能🌸 (2)列表页功能🌸 (3)编辑博客功能🌸 (4&…

DC LAB8SDC约束四种时序路径分析

DC LAB 1.启动DC2.读入设计3. 查看所有违例的约束报告3.1 report_constraint -all_violators (alias rc)3.2 view report_constraint -all_violators -verbose -significant_digits 4 (打印详细报告) 4.查看时序报告 report_timing -significant_digits 45. 约束组合逻辑(adr_i…

17 条件随机场

文章目录 17 条件随机场——CRF(Condition Random Field)17.1 背景介绍17.2 HMM与MEMM的区别17.3 MEMM与CRF的区别17.4 CRF模型17.4.1 CRF的概率密度函数17.4.2 CRF概率密度函数简化(向量形式) 17.5 CRF需要解决的问题17.6 边缘概…

测试者必知—如何做Web测试?常见测试点总结

目录 前言: 一、Web应用程序 二、功能测试 三、易用性测试(界面测试) 四、兼容性测试 五、安全性测试 六、性能测试 前言: Web测试是指对基于Web技术的应用程序进行测试,以测试其功能、性能、安全和稳定性等方面的表…

【图书推荐 | 12】前端系列

【赠书活动第十二期 】 图书推荐 本期书籍:前端系列 图书列表: Vue.js核心技术解析Nuxt.js实战Nuxt.js Web开发实战HTML5CSS 从入门到精通Flutter2 开发实例精解Electron项目开发实战 Vue.js核心技术解析 Nuxt.js实战 Nuxt.js Web开发实战 HTML5CSS 从入…

【业务功能篇20】Springboot java逻辑实现动态行转列需求

在此前,我也写过一个行转列的文章,是用存储过程sql处理的一个动态的逻辑 Mysql 存储过程\Mybatis框架call调用 实现动态行转列 那么后面我们同样又接收了业务的一个新需求,针对的是不同的业务数据,做的同样的一个展示数据报表&…

VueX使用简明笔记

1、作用: vuex是使用vue中必不可少的一部分,基于父子、兄弟组件,我们传值可能会很方便,但是如果是没有关联的组件之间要使用同一组数据,就显得很无能为力,那么vuex就很好的解决了我们这种问题,…

MySQL数据库 – node使用

1 MySQL查询对象 2 MySQL查询数组 3 mysql2库介绍使用 4 mysql2预处理语句 5 mysql2连接池使用 6 mysql2的Promi 这里仅说明如何使用服务器连接数据库并进行操作。 预处理语句就是可以输入变量的语句(表现形式是有符号:?)。需…

portraiture宿主插件最新v4中文版本下载及使用教程

自拍怎么可以不修图呢?如果要修图的话,磨皮就是其中非常重要的一环。皮肤看起来细腻光滑了,整个人的颜值都会瞬间拉高。下面就让我们介绍一下磨皮用什么软件好用,什么软件可以手动磨皮的相关内容。portraiture是ps人像修图中常用的…

为何唐宋诗词鼎盛,而到了明清变成了小说

我国是一个历史悠久的国家,在漫长的历史长河中,随着朝代的更替,很多事也发生了有趣的变化。 例如唐宋时期盛行的是诗词,而到了明清时代,小说又开始盛行了起来,那么造成这种文风改变的原因是什么呢&#xf…

Java版本spring cloud 工程管理系统软件 系统源代码 自主研发,工程行业适用

Java版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 功能清单如下: 首页 工作台:待办工作、消息通知、预警信息,点击可进入相应的列表 项目进度图表:选择(总体或单个)项目显示…

实战案例|黑灰产肆虐,腾讯ACE一键打造清朗游戏世界

随着游戏行业的快速发展,相关黑色产业链的问题日益严重,各种外挂、违规内容、非法交易现象的出现破坏着游戏的生态,为行业带来诸多安全挑战,也影响着玩家们的游戏体验。越来越多游戏厂商开始重视游戏安全问题,并探索全…

华为OD机试真题 JavaScript 实现【最远足迹】【2022Q4 100分】,附详细解题思路

一、题目描述 某探险队负责对地下洞穴进行探险。探险队成员在进行探险任务时,随身携带的记录器会不定期地记录自身的坐标,但在记录的间隙中也会记录其他数据。探索工作结束后,探险队需要获取到某成员在探险过程中相对于探险队总部的最远的足…

Mujoco210 Ubuntu 22.04配置安装(一)

目录 .1 下载 1.1 解压 1.2 许可问题 1.3 环境配置 1.4 测试mujoco .2 安装mujoco-py 2.1 conda激活虚拟环境\或新创建一个环境 2.2 下载mujoco-py ​编辑 2.3 配置环境变量 2.4 测试mujoco-py 2.5 测试时的一些报错处理 2.5.0 command /usr/bin/gcc failed with…

读写ini配置文件(C++)

文章目录 1、为什么要使用ini或者其它(例如xml,json)配置文件?2、ini文件基本介绍3、ini配置文件的格式4、C读写ini配置文件5、 代码示例6、 配置文件的解析库 文章转载于:https://blog.csdn.net/weixin_44517656/article/details/109014236 1、为什么要…

docker harbor私有仓库部署

docker harbor私有仓库部署 docker system prune -a 删除停掉的服务,自定义网络等。 docker 私有仓库 docker配置文件 vim /etc/docker.daemon.josn { “insecury-registries”: ["192.168.232.10:5000],#指定私有仓库 } docker pull/push 19…