六种常见的排序算法

article/2025/10/9 15:15:51

一.冒泡排序

        冒泡排序就是重复“从序列右边开始比较相邻两个数字的大小,再根据结果交换两个数字 的位置”这一操作的算法。在这个过程中,数字会像泡泡一样,慢慢从右往左“浮”到序列的 顶端,所以这个算法才被称为“冒泡排序”。

在冒泡排序中,第 1 轮需要比较 n -1 次,第 2 轮需要比较 n -2 次……第 n -1 轮需 要比较 1 次。因此,总的比较次数为 (n -1) +(n -2) +…+1 ≈ n2 /2。这个比较次数恒定为 该数值,和输入数据的排列顺序无关。

冒泡排序的时间复杂度为 O(n2 )。

二.选择排序

        选择排序就是重复“从待排序的数据中寻找最小值,将其与序列最左边的数字进行交换” 这一操作的算法。在序列中寻找最小值时使用的是线性查找。

选择排序的时间复杂度也和冒泡排序的一样,都为 O(n2 )。

三.插入排序

        插入排序是一种从序列左端开始依次对数据进行排序的算法。在排序过程中,左侧的数据 陆续归位,而右侧留下的就是还未被排序的数据。插入排序的思路就是从右侧的未排序区域内 取出一个数据,然后将它插入到已排序区域内合适的位置上

以时间复杂度和冒泡排序的一样,都为 O(n2 )。

1.首先,我们假设最左边的数字5已经完成排序,所以此时只有5是已归位的数字。

2.接下来,从待排数字(未排序区域)中取出最左边的数字 3,将它与左边已归位的数字进行比较。若左 边的数字更大,就交换这两个数字。重复该操作,直到左边已归位的数字比取出的数字更小,或者取 出的数字已经被移到整个序列的最左边为止。由于5>3,所以交换这两个数字。

 3.对数字3的操作到此结束。此时3和5已归位,还剩下右边7个数字尚未排序。

 4.重复上述操作,直到所有数字都归位。

四.堆排序

        堆排序的特点是利用了数据结构中的堆。

        堆排序一开始需要将 n 个数据存进堆里,所需时间为 O(nlogn)。排序过程中,堆从 空堆的状态开始,逐渐被数据填满。由于堆的高度小于 log2n,所以插入 1 个数据所需要 的时间为 O(logn)。

        每轮取出最大的数据并重构堆所需要的时间为 O(logn)。由于总共有 n 轮,所以重 构后排序的时间也是 O(nlogn)。因此,整体来看堆排序的时间复杂度为 O(nlogn)。

         这样来看,堆排序的运行时间比之前讲到的冒泡排序、选择排序、插入排序的时间 O(n2 ) 都要短,但由于要使用堆这个相对复杂的数据结构,所以实现起来也较为困难。

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

 2.现在,所有数据都存进堆里了。为了排序,需要再从堆中把数据一个个取出来。

3.从降序排列的堆中取出数据时会从最大的数据开始取,所以将取出的数据反序输出,排序就完成了。首先取出根结点的数字7。

 4.重新构造堆。

5.同样地,取出根结点的数字6,将它放在右数 第2个位置上。

6.重复上述操作直到堆变空为止,从堆中取出了所有数字,排序完成。

五.归并排序

        归并排序算法会把序列分成长度相同的两个子序列,当无法继续往下分时(也就是每个子 序列中只有一个数据时),就对子序列进行归并。归并指的是把两个排好序的子序列合并成一个 有序序列。该操作会一直重复执行,直到所有子序列都归并为一个整体为止。总的运行时间为 O(nlogn),这与前面讲到的堆排序相同。

1首先,要把序列对半分割,先分成两段,再继续往下分,分割完毕。

 

2接下来对分割后的元素进行合并,合并时需要将数字按从 小到大的顺序排列。把6和4合并,合并后的顺序为[4, 6]。接下来把3和7合并,合并后的顺序为[3, 7]。

 

3 此时要比较 两个子序列 的首位数字 4 和 3。下面,我们来看看合并 [4, 6]和[3, 7]。合并这种含 有多个数字的子序列时,要先比较首位数字,再移动较小的数字。

4递归执行上面的操作,直到所有的数字都合为 一个整体为止。这里也要比较两个子序列中的 首位数字。合并完成,序列的排序也就完成了。

 

 

六.快速排序

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

 

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

 

         3首先来看看 如何对右边的数据进行排序吧。随机选择一个基准值。这次选择6。把其余数据分别和基准值6进行比较,小于基 准值的就往左移,大于的就往右移。完成了大小比较和位置移动。

        4和前面一样,对左右两边分别进行排序,进而完成整体排序。但是此时左边只有 5,所以已经是排序完 成的状态,不需要任何操作。而右边就和前面一样,先选出基准值。选择8作为基准值。将9和7分别与基准值8进行比较后,两个数字 的位置便分好了。8的两边都只有一个数据,因 此不需要任何操作。这样7、8、9便完成排序了。

 

         5回到上一行,由于7、8、9完成了排序,所以 5、6、7、8、9也完成了排序。于是,最初选择的基准值4的右边排序完毕。

        6左边也以相同的操作进行排序,整体的排序工作也就完成了。

 

 

         总结:快速排序是一种“分治法”。它将原本的问题分成两个子问题(比基准值小的数和 比基准值大的数),然后再分别解决这两个问题。子问题,也就是子序列完成排序后,再 像一开始说明的那样,把他们合并成一个序列,那么对原始序列的排序也就完成了。 不过,解决子问题的时候会再次使用快速排序,甚至在这个快速排序里仍然要使用 快速排序。只有在子问题里只剩一个数字的时候,排序才算完成。 像这样,在算法内部继续使用该算法的现象被称为“递归”。

 


http://chatgpt.dhexx.cn/article/jHJVjRPk.shtml

相关文章

异常:解决idea一直更新索引的问题

前言 前段时间在用idea的时候,一开始很正常,当我引入其他项目的时候,索引就一直在更新,几个小时过去了,还没有停下来的意思。照着网上搜索来的步骤开始操作(File–>Invalidate Caches/Restart)。好不容易更新索引停…

【Elasticsearch】索引、更新和删除数据

前言 1、使用映射类型来定义同一个索引中的多种文档类型 2、可以在映射中使用的不同字段类型 3、使用预定义的字段及其选项 4、上述这些如何帮助数据的索引、更新和删除 内容 3种类型字段,这些字段是元数据,es会自动管理它们 核心——这些字段包括…

动态更新索引

下一个需要被解决的问题是怎样在保留不变性的前提下实现倒排索引的更新? 答案是: 用更多的索引。 通过增加新的补充索引来反映新近的修改,而不是直接重写整个倒排索引。每一个倒排索引都会被轮流查询到--从最早的开始--查询完后再对结果进行合并。 Ela…

ES索引结构升级-笔记

ES中索引的字段类型是不可修改的,只能是重新创建一个索引并设置好mapping,然后再将老索引的数据复制过去 查看老索引mapping GET /twitter/_mappings创建new索引,并指定mapping PUT /twitter410{"mappings": {"properties&…

深耕ElasticSearch - 动态更新索引

文章目录 1. 建立索引2. 倒排索引的不变性3. 动态更新索引3.1 动态更新索引原理3.2 新增文档3.3 删除和更新文档 1. 建立索引 给定一个文档集合(这个集合中的文档是不变的),索引是如何建立起来的呢? 首先在内存里维护一个倒排索…

Solr 新增、更新、删除索引

solr-admin新增索引 [索引中无则新增,有则更新] 第一种方式&#xff1a;在doc标签和field标签中增加权重&#xff08;boost&#xff09;&#xff0c;增加权重后&#xff0c;可以在搜索的时候做权重过滤。 1 2 3 4 <delete> <query> id:"100861"<…

全文索引----solr服务器更新增量索引

上篇文章我们介绍了全量更新solr索引&#xff0c;但是在数据量较大时&#xff0c;频繁的更新索引会消耗系统性能&#xff0c;如果更新频率较低&#xff0c;则会影响短时的数据准确性&#xff0c;所以&#xff0c;更新时间的间隔是个很难界定。增量索引解决了这个问题&#xff0…

解决IDEA一直出现更新索引ideal Updating Indices: Indexing paused问题

前言 小编我将用CSDN记录软件开发求学之路上亲身所得与所学的心得与知识&#xff0c;有兴趣的小伙伴可以关注一下&#xff01; 也许一个人独行&#xff0c;可以走的很快&#xff0c;但是一群人结伴而行&#xff0c;才能走的更远&#xff01;让我们在成长的道路上互相学习&…

es 根据索引名称和索引字段更新值

1&#xff1a;指定索引名称和操作指令 instodayorder_new_2022/_update_by_query 2&#xff1a;执行代码 { "script": { "lang": "painless", "source": "if (ctx._source.reserveString_3 null) {ctx._source.reser…

es 修改(更新)索引模板

es 修改(更新)索引模板 es索引模板的好处就不用我多说了&#xff0c;我这里遇到的问题是&#xff0c;如何修改es模板&#xff0c;网上检索的关键词大多是新增/删除模板&#xff0c;我记录一下自己的修改模板操作吧&#xff08;我是在kibana的UI界面进行操作的&#xff09; 1.…

SQL 索引的操作 数据查询(1)数据更新

文章目录 索引的建立与删除建立索引修改索引删除索引 数据更新插入数据插入元组插入子查询结果 修改数据删除数据 数据查询单表查询查询经过计算的值选择表中的若干元组 索引的建立与删除 建立索引 在SQL语言中&#xff0c;建立索引使用 CREATE INDEX 语句&#xff0c;其一般…

Elasticsearch7.8.0版本进阶——动态更新索引

目录 一、如何在保留不变性的前提下实现倒排索引的更新二、按段搜索执行流程三、按段搜索的文档查询四、按段搜索的文档删除五、按段搜索的文档更新 一、如何在保留不变性的前提下实现倒排索引的更新 用更多的索引。通过增加新的补充索引来反映最近的修改&#xff0c;而不是直…

ElasticSearch 动态更新索引

Elasticsearch版本:2.x 1. 不变性 倒排索引被写入磁盘后是 不可改变(immutable):永远不会被修改。不变性有如下几个重要的优势: 不需要锁。如果你没有必要更新索引,你就没有必要担心多进程会同时修改数据。一旦索引被读入内核的文件系统缓存中,由于其不会改变,便会留在那…

MySQL:插入,更新与删除、索引

一、学习目标 掌握如何向表中插入数据掌握更新数据的方法熟悉如何删除数据掌握对数据表基本操作的方法和技巧了解什么是索引掌握创建索引的方法和技巧熟悉如何删除索引熟悉掌握索引的常见问题 二、实验内容 创建表books&#xff0c;对数据表进行插入、更新和删除操作&#x…

搜索引擎索引之如何更新索引

本文节选自《这就是搜索引擎&#xff1a;核心技术详解》第三章 动态索引通过在内存中维护临时索引&#xff0c;可以实现对动态文档和实时搜索的支持。但是服务器内存总是有限的&#xff0c;随着新加入系统的文档越来越多&#xff0c;临时索引消耗的内存也会随之增加。当最初分…

IDEA总是自动更新索引怎么解决

从File进入settings 搜索index_>修改右边的两个即可,点击OK保存即可

项目中如何使用ElasticSearch?变更数据时难道既更新数据库也要更新索引?这篇文章也许对你有点帮助(持续更新)

目录 1. 概述2.ElasticSearch的调试2.1 启动ES2.2 创建搜索的微服务2.3 使用logstash同步数据库数据到es的索引中 3.Linux系统下部署3.1 拉取es容器3.2 让9300端口可用3.3 安装ik分词器3.4 安装head-master3.5 配置logstash&#xff08;耗时最久&#xff09; 四. 出现的bug4.1 …

【Mysql】 sql语句实现update_or_create(唯一索引 ON DUPLICATE KEY UPDATE)

【Mysql】 on duplicate key update用法、优缺点以及使用案例 1. 应用场景&#xff1a; 导入数据功能&#xff0c;需要实现数据不存在时进行新建&#xff0c;有数据修改时则进行更新。在实现时&#xff0c;思路通常为先判断数据是新增还是更新&#xff0c;除了我们在代码层面实…

mysql-索引

1.索引的定义&#xff1a; 索引是帮助MySql高效获取数据的数据结构。在数据之外&#xff0c;数据库系统还维护着满足特定查找算法的数据结构&#xff0c;这些数据结构以某种方式引用数据&#xff0c;这样就可以在这些数据结构上实现高级查找算法&#xff0c;这种数据结构就是索…