算法复习——6种排序方法的简单回顾

算法复习——6种排序方法的简单回顾

常见排序方法:冒泡排序、选择排序、插入排序、堆排序、归并排序、快速排序的简单回顾

冒泡排序

重复“从序列右边开始比较相邻两个数字的大小,再根据结果交换两个数字的位置”

在这里插入图片描述

在冒泡排序中,第 1 轮需要比较 n - 1 次,第 2 轮需要比较 n - 2 次…第 n - 1 轮需要比较 1 次。因此,总的比较次数为 (n - 1) + (n - 2) + … + 1≈n2/2。

时间复杂度:O(n²)

选择排序

重复“从待排序的数据中寻找最小值,将其与序列最左边的数字进行交换”

在这里插入图片描述

使用线性查找在数据中寻找最小值,找到最小值1。(详见下一篇文章:数组的查找:线性查找,二分查找)

与最左端数字6交换,即可完成此次操作。

在余下的数字中寻找最小值,重复以上操作:

在这里插入图片描述

比较次数:(n - 1) + (n - 2) + … + 1≈n2/2 次

时间复杂度:O(n²)

插入排序

从序列左端开始依次对数据进行排序。插入排序的思路就是从右侧的未排序区域内取出一个数据,然后将它插入到已排序区域内合适的位置上。

在这里插入图片描述

首先先排好5在第一个位置。从待排数字(未排序区域)中取出最左边的数字 3,将它与左边已归位的数字进行比较。若左边的数字更大,就交换这两个数字。重复该操作,直到左边已归位的数字比取出的数字更小,或者取出的数字已经被移到整个序列的最左边为止。

时间复杂度:O(n²)

堆排序

利用了数据结构中的堆。关于堆的介绍可以见上一章:数据结构复习-CSDN博客

在这里插入图片描述

首先,在堆中存储所有的数据,并按降序来构建堆。

在这里插入图片描述

取出第一个数字后,重新构造堆。

重复上述操作直到堆变空为止。

在这里插入图片描述

时间复杂度:O(nlogn)

虽然运行时间短,但数据结构相对复杂,实现起来相对困难。

归并排序

把序列分成长度相同的两个子序列,当无法继续往下分时(也就是每个子 序列中只有一个数据时),就对子序列进行归并。

归并:把两个排好序的子序列合并成一个有序序列。

在这里插入图片描述

在这里插入图片描述

将序列逐次分割。分割完毕后,按从小到大顺序合并。

在这里插入图片描述

合并这种含有多个数字的子序列时,要先比较首位数字,再移动较小的数字。

在这里插入图片描述

归并排序中,分割序列所花费的时间不算在运行时间内(可以当作序列本来就是分割好的)

无论哪一行都是n个数据,所以每行的运行时间都为 O(n)。而将长度为 n 的序列对半分割直到只有一个数据为止时,可以分成 log2n 行。

时间复杂度:O(nlogn)

快速排序

首先会在序列中随机选择一个基准值(pivot),然后将除了基准值以外的数分为“比基准值小的数”和“比基准值大的数”这两个类别,再将其排列成以下形式。

[ 比基准值小的数 ] 基准值 [ 比基准值大的数 ]

接着,对两个“[ ]”中的数据进行排序之后,整体的排序便完成了。对“[ ]”里面的数据进行排序时同样也会使用快速排序。

在这里插入图片描述

举例:随机取4为基准值。将其他数字和基准值进行比较。小于基准值的往左移,大于基准值的往右移。

在这里插入图片描述

完成后,再分别对左边和右边的数据进行快速排序,就能完成整体的排序。

快速排序是一种**“分治法”**。它将原本的问题分成两个子问题(比基准值小的数和比基准值大的数),然后再分别解决这两个问题。

像这样,在算法内部继续使用该算法的现象被称为**“递归”**。

时间复杂度:O(nlogn)(如果数据中的每个数字被选为基准值的概率都相等,平均运行时间)

参考资料:我的第一本算法书 (石田保辉 宮崎修一)

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

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

相关文章

VR转接线方案/VR Link串流数据线方案/VR眼镜PD快充方案

虚拟现实技术(英文名称:Virtual Reality,缩写为VR),又称虚拟实境或灵境技术,是20世纪发展起来的一项全新的实用技术。虚拟现实技术囊括计算机、电子信息、仿真技术,其基本实现方式是以计算机技术为主,利用并…

Python编程技巧 – 异常处理

Python编程技巧 – 异常处理 Python Programming Skills – Exception Handling By JacksonML 每一个程序都未必是健壮的,有时候很脆弱。只有在人的理想思维状况下,返回的结果才是正确的,如意的。 1. 错误发生及异常输出 面对种种编写有疏…

Python爬虫代理程序如何应对目标网站反爬策略

玩过python爬虫的都知道,在爬虫程序编写过程中,可能会遇到目标网站的反爬策略,需要不停的和网站做技术抗争,并且需要不停的更新反爬策略。这些策略防止程序过度爬取影响服务器负载。下面就是我总结的一些经验技巧可以看看。 我们…

线上盲盒扭蛋机,开启潮玩新玩法

盲盒近几年非常火爆,因其不确定性、随机性吸引着盲盒爱好者,引起了潮玩文化风潮。扭蛋机是盲盒的一种新抽取模式,线上扭蛋机小程序在具有盲盒的优势外,还具有较大吸引力,用户参与率较高,这也使得扭蛋机成为…

基于SpringBoot+maven+Mybatis+html慢性病报销系统(源码+数据库)

一、项目简介 本项目是一套基于SpringBootmavenMybatishtml慢性病报销系统,主要针对计算机相关专业的正在做bishe的学生和需要项目实战练习的Java学习者。 包含:项目源码、数据库脚本等,该项目可以直接作为bishe使用。 项目都经过严格调试&a…

智能优化算法应用:基于战争策略算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于战争策略算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于战争策略算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.战争策略算法4.实验参数设定5.算法结果6.参考…

Java零基础——Elasticsearch篇

1.Elasticsearch简介 Elasticsearch是一个基于Lucene的一个开源的分布式、RESTful 风格的搜索和数据分析引擎。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。Elasticsearch用于云计算中&#xf…

在intelliJ spring boot gradle插件3.2.0中未找到匹配的变量

我正在尝试使用spring启动Gradle插件的版本3.2.0。这是我的build.gradle文件: plugins {id javaid org.springframework.boot version 3.2.0id io.spring.dependency-management version 1.1.4 }group com.yaxin version 0.0.1-SNAPSHOTjava {sourceCompatibilit…

【Python系列】Python函数

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

【Linux】diff命令使用

diff命令 是一个用于比较两个文件或目录之间差异的命令。它可以显示两个文件之间的行级别差异,并以易于阅读的格式输出结果。 著者 由保罗艾格特、迈克海特尔、大卫海耶斯、理查德史泰尔曼和Len Tower撰写。 diff命令 -Linux手册页 语法 diff [选项] [文件1]…

kyuubi整合flink yarn application model

目录 概述配置flink 配置kyuubi 配置kyuubi-defaults.confkyuubi-env.shhive 验证启动kyuubibeeline 连接使用hive catalogsql测试 结束 概述 flink 版本 1.17.1、kyuubi 1.8.0、hive 3.1.3、paimon 0.5 整合过程中,需要注意对应的版本。 注意以上版本 姊妹篇 k…

C++新经典模板与泛型编程:策略类模板

策略类模板 在前面的博文中,策略类SumPolicy和MinPolicy都是普通的类,其中包含的是一个静态成员函数模板algorithm(),该函数模板包含两个类型模板参数。其实,也可以把SumPolicy和MinPolicy类写成类模板—直接把algorithm()中的两…