详解排序算法(二)之2种交换排序(冒泡排序、快速排序)

十大排序算法详解(一)冒泡排序、选择排序、插入排序、快速排序、希尔排序 冒泡排序、选择排序、插入排序、快速排序、希尔排序 阅读详情

冒泡排序

所谓冒泡排序,就是相邻的两个元素相互比较并根据比较结果决定是否交换位置。如从小到大排序,相邻两个元素两两比较,将值更大的元素交换到右侧,如此到最后一个元素,就能确定最大的一个值,一轮排序结束。若某一轮排序交换位置的次数为0,则排序结束。

我们取 3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48 来进行示范

第一轮排序

  1. 3 与 44 比较 ,3 < 44 ,不变 ,得 3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48

  2. 44 与 38 比较 ,44 > 38,44 与 38 交换,得 3, 38, 44, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48

  3. 44 与 5 比较 ,44 > 5 ,44 与 5 交换,得 3, 38, 5, 44, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48

  4. 44 与 47 比较 ,44 < 47,不变 ,得 3, 38, 5, 44, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48

  5. 47 与 15 比较 ,47 > 15,47 与 15 交换,得 3, 38, 5, 44, 15, 47, 36, 26, 27, 2, 46, 4, 19, 50, 48

  6. 47 与 36 比较 ,47 > 36,47 与 36 交换,得 3, 38, 5, 44, 15, 36, 47, 26, 27, 2, 46, 4, 19, 50, 48

  7. 47 与 26 比较 ,47 > 26,47 与 26 交换,得 3, 38, 5, 44, 15, 36, 26, 47, 27, 2, 46, 4, 19, 50, 48

  8. 47 与 27 比较 ,47 > 27,47 与 27 交换,得 3, 38, 5, 44, 15, 36, 26, 27, 47, 2, 46, 4, 19, 50, 48

  9. 47 与 2 比较 ,47 > 2,47 与 2 交换 , 得 3, 38, 5, 44, 15, 36, 26, 27, 2, 47, 46, 4, 19, 50, 48

  10. 47 与 46比较 ,47 > 46,47 与 46 交换,得 3, 38, 5, 44, 15, 36, 26, 27, 2, 46, 47, 4, 19, 50, 48

  11. 47 与 4 比较 ,47 > **4 **,47 与 4 交换 ,得 3, 38, 5, 44, 15, 36, 26, 27, 2, 46, 4, 47, 19, 50, 48

  12. 47 与 19 比较 ,47 > 19,47 与 19 交换,得 3, 38, 5, 44, 15, 36, 26, 27, 2, 46, 4, 19, 47, 50, 48

  13. 47 与 50 比较 ,47 < 50,不变 ,得 3, 38, 5, 44, 15, 36, 26, 27, 2, 46, 4, 19, 47, 50, 48

  14. 50 与 48 比较 ,50 > 48,50 与 48 交换,得 3, 38, 5, 44, 15, 36, 26, 27, 2, 46, 4, 19, 47, 48, 50

第一轮排序结束,交换位置次数:11

第二轮排序同理

当某一轮排序交换位置次数为 0,表明元素已满足从小到大排序,冒泡排序结束。

动态图

img

javascript代码

function bubbleSort(arr) {
    let count  // 一轮排序元素交换次数

    for (let i = 0; i < arr.length; i++) {
        count = 0

        for (let j = 1; j < arr.length - i; j++) {
            if (arr[j] < arr[j-1]) {
                temp = arr[j - 1]
                arr[j - 1] = arr[j]
                arr[j] = temp
                count++
            }
        }

        if (count === 0) break
    }

    return arr
}

快速排序

快速排序是由东尼·霍尔所发展的一种排序算法。从本质上来看,快速排序是一种递归分治法。

算法步骤

  1. 从数列中挑出一个元素,称为 “基准”(pivot);
  2. 将元素分而治之,小的置于基准值左侧,大的置于基准值右侧;
  3. 基准值两侧作为两个子数列,再分别找一个基准值,重复 步骤1。

我们仍取 3, 44, 38, 5, 47, 15, 36, 26, 27, 2, 46, 4, 19, 50, 48 来进行示范

第一轮排序

  1. 取基准值为 3
  2. 将 3 与 44, 38, 5, 47, 15, 36, 26, 27 比较,3比它们都小,位置保持不变
  3. 将 3 与 2 比较,3 > 2,2 与 44 交换位置,得 3, 2, 38, 5, 47, 15, 36, 26, 27, 44, 46, 4, 19, 50, 48
  4. 将 3 继续与 46, 4, 19, 50, 48比较,3比它们都小,位置保持不变
  5. 将 3 与 2 交换,得 2, 3, 38, 5, 47, 15, 36, 26, 27, 44, 46, 4, 19, 50, 48

可以发现,3 将数列分成了左右两部分子数列。再对子数列进行同样操作,即第二轮排序。

第二轮排序

  1. 左子数列只有一个元素,无需排序
  2. 右子数列取基准值为 38
  3. 38 > 5,5位置不变,得 2, 3, 38, 5, 47, 15, 36, 26, 27, 44, 46, 4, 19, 50, 48
  4. 38 < 47,位置不变,得 2, 3, 38, 5, 47, 15, 36, 26, 27, 44, 46, 4, 19, 50, 48
  5. 38 > 15,15 与 47 互换,得 2, 3, 38, 5, 15, 47, 36, 26, 27, 44, 46, 4, 19, 50, 48
  6. 38 > 36,36 与 47 互换,得 2, 3, 38, 5, 15, 36, 47, 26, 27, 44, 46, 4, 19, 50, 48
  7. 38 > 26,26 与 47 互换,得 2, 3, 38, 5, 15, 36, 26, 47, 27, 44, 46, 4, 19, 50, 48
  8. 38 > 27,27 与 47 互换,得 2, 3, 38, 5, 15, 36, 26, 27, 47, 44, 46, 4, 19, 50, 48
  9. 38 < 44, 46, 位置不变 ,得 2, 3, 38, 5, 15, 36, 26, 27, 47, 44, 46, 4, 19, 50, 48
  10. 38 > 4, 4 与 47 互换,得 2, 3, 38, 5, 15, 36, 26, 27, 4, 44, 46 , 47, 19, 50, 48
  11. 38 > 19,44 与 19 互换,得 2, 3, 38, 5, 15, 36, 26, 27, 4, 19, 46 , 47, 44, 50, 48
  12. 38 < 50, 48,位置不变 ,得 2, 3, 38, 5, 15, 36, 26, 27, 4, 19, 46 , 47, 44, 50, 48
  13. 将 38 与 19 交换,得 2, 3, 19, 5, 15, 36, 26, 27, 4, 38, 46 , 47, 44, 50, 48

可以发现,38 将右子数列又分成了左右两部分。再对子数列进行同样操作,即第三轮排序。

如此重复操作,直到分无可分,子数列元素个数为1时,排序结束。

动态图

img

javascript代码

function quickSort(arr, low = 0, high = arr.length - 1) {
   if (low >= high) return

   const pivot = paritition(arr, low, high)

   quickSort(arr, low, pivot - 1)
   quickSort(arr, pivot + 1, high)

   return arr
}

function paritition (arr, low, high) {
    const pivot = arr[low] // 基准值
    let pivotIndex = low // 基准值最终位置

    for (let i = low; i <= high; i++) {
        if (arr[i] < pivot) {
            const temp = arr[i]
            arr[i] = arr[++pivotIndex]
            arr[pivotIndex] = temp
        }
    }

    arr[low] = arr[pivotIndex]
    arr[pivotIndex] = pivot

    return pivotIndex
}

除上面这种分割方式外,这里再介绍另一种快速排序的分割方式,那就是 严蔚敏《数据结构》标准分割函数

第一轮排序

  1. 取基准值为 3
  2. 从右向左(48开始) ,找到第一个小于 3 的值 2,交换 ,得 2, 44, 38, 5, 47, 15, 36, 26, 27, 3, 46, 4, 19, 50, 48
  3. 再从左向右(44开始),找到第一个大于 3 的值 44,交换,得 2, 3, 38, 5, 47, 15, 36, 26, 27, 44, 46, 4, 19, 50, 48
  4. 从右向左(27开始) ,未找到小于 3 的值 ,得 2, 3, 38, 5, 47, 15, 36, 26, 27, 44, 46, 4, 19, 50, 48

第二轮排序

  1. 左子数列只有一个元素,无需排序
  2. 右子数列取基准值为 38
  3. 从右向左(48开始),找到第一个小于 38 的值 19,交换 ,得 2, 3, 19, 5, 47, 15, 36, 26, 27, 44, 46, 4, 38, 50, 48
  4. 从左向右(5开始),找到第一个大于 38 的值 47,交换,得 2, 3, 19, 5, 38, 15, 36, 26, 27, 44, 46, 4, 47, 50, 48
  5. 从右向左(4开始) ,找到第一个小于 38 的值 4,交换 ,得 2, 3, 19, 5, 4, 15, 36, 26, 27, 44, 46, 38, 47, 50, 48
  6. 从左向右(15开始),找到第一个大于 38 的值 44,交换,得 2, 3, 19, 5, 4, 15, 36, 26, 27, 38, 46 , 44, 47, 50, 48
  7. 从右向左(46开始),未找到第一个小于 38 的值 ,得 2, 3, 19, 5, 4, 15, 36, 26, 27, 38, 46 ,44, 47, 50, 48

如此重复操作,直到分无可分,子数列元素个数为1时,排序结束。

javascript代码

function quickSort(arr, low = 0, high = arr.length - 1) {
    if (low >= high) return
 
    const pivot = paritition(arr, low, high)
 
    quickSort(arr, low, pivot - 1)
    quickSort(arr, pivot + 1, high)
 
    return arr
 }
 
 // 严蔚敏《数据结构》标准分割函数
 function paritition (arr, low, high) {
     const pivot = arr[low] // 基准值
 
     while (low < high) {
        while (low < high && arr[high] >= pivot) {
            high--
        }

        arr[low] = arr[high]

        while (low < high && arr[low] <= pivot) {
            low++
        }

        arr[high] = arr[low]
     }

     arr[low] = pivot

     return low
 }

两种算法的复杂度及稳定性

排序算法时间复杂度(平均)时间复杂度(最坏)时间复杂度(最好)空间复杂度稳定性
冒泡排序O(n2)O(n2)O(n)O(1)稳定
快速排序O(nlog2n)O(n2)O(nlog2n)O(log2n)不稳定
排序算法解析——冒泡排序、选择排序、快速排序 时间复杂度是度量算法执行的时间长短,而空间复杂度是度量算法所需存储空间的大小。 算法的时间复杂度记做:T(n)=O(f(n))     在计算时间复杂度的时候,先找出算法的基本操作,然后根据相应的各语句确定它的执行次数,再找出T(n)的同数量级(它的同数量级有以下:1、Log2n、n、nLog2n、n的平方、n的三次方、2的n次方、n!),找出后,f(n)=该数量级,如冒泡排序的时间复 阅读详情

相关推荐

【排序】交换类排序—冒泡排序、快速排序手撕图解

交换类排序——冒泡排序、快速排序详解。无论是日后面试还是笔试的,排序在数据结构与算法中有着举足轻重的地位,所以还是决定把数据结构这个专题好好写写,多研究研究!今天和大家一起学习**交换类排序**——冒泡和快排详解! 在排序中,**冒泡和快排是考察最多**的了,当然在实行上面`冒泡要相比快排简单很多`。理解起来也算得上是最简单的排序算法,而快排的话很多面试笔试都是**要求手撕**的,所以重要性不言而喻!

bigsai 8607

交换排序与冒泡排序

今天在读公司的平台代码的时候发现了一些排序

XscKernel的专栏 记录工作中做的点滴 2749

保姆级教程:用Python+OpenCV搞定Orbbec Gemini深度与彩色流对齐(附完整代码)

本文提供了一份详细的Orbbec Gemini深度与彩色流对齐教程,涵盖从环境配置到完整代码实现的每一步。通过解析深度流对齐原理,对比不同对齐模式,并提供工业级应用中的问题排查方法,帮助开发者快速掌握Orbbec Gemini相机的使用技巧。文章还包含进阶应用如点云生成与三维重建的实战代码。

weixin_29090917的博客 470

交换排序,选择排序,冒泡排序

交换排序,选择排序,冒泡排序

小S的博客 2146

14 ABSOLUTE评估肿瘤纯度

14 ABSOLUTE评估肿瘤纯度 Absolute介绍 ABSOLUTE可以直接从体细胞突变和拷贝数变异的结果中推断肿瘤纯度和倍性的计算方法。 通常来说,我们取肿瘤组织进行测序,往往是一个混合样品,既包括肿瘤细胞也包括正常细胞,因此需要进行肿瘤纯度 purity 的评估。当从混合样品中提取 DNA 进行测序后,得到的也是一个混合样品的结果。肿瘤不一定是单纯的二倍体了,其本身异质性高,存在部分突变部分不突变的情况,直接分析拷贝数变异,得到的结果并不准确,评估肿瘤倍性 ploidy 也更加必要。而 ABSO

qq_23435961的博客 4215

SAP-ABAP:ABAP Development Tools(ADT)安装配置学习分享教程-第一篇:ADT安装前置准备与环境校验教程

ABAP Development Tools(ADT)安装配置教程摘要 本文是ADT安装系列的第一篇,重点讲解环境准备与版本校验。ADT是基于Eclipse的现代ABAP开发工具,相比传统SAP GUI提供更智能的开发体验。安装前需确认: 推荐使用Eclipse 2026-03 + Java 21组合 操作系统需Windows 10+/macOS 14+ SAP GUI版本要求Windows≥8.00/macOS≥8.10 后端系统需NetWeaver 7.31 SP04+或S/4HANA 通过java -

baidu_35680696的博客 690

交换排序——选择排序和冒泡排序的区别是什么?

冒泡排序属于交换排序算法的一种;选择排序算法是原地排序算法的一种;冒泡排序的核心思想是把相邻的元素进行两两比较,当一个元素大于右侧相邻的元素时,就交换它们的位置;当一个元素小于或等于右侧相邻的元素时,则保持位置不变。选择排序的实现思想,就是不断地从未排序的元素中选择最大(或最小)的元素,放入到已排好序的元素集合中,直到未排序的元素为空。两者的区别简单了说就是冒泡排序在比较的过程中待排序的数据会发生位置改变,而选择排序法在比较过程中,是记录较大/较小数据的索引,只有在找到最大/最小数据的时候才会发生交换。

weixin_62458944的博客 1975

knowhere | 第一课:项目导论与环境搭建

摘要 本课程是Knowhere项目的第一课,重点介绍项目整体架构和开发环境搭建。Knowhere定位为AI Agent的文档记忆基础设施,通过解析多格式文档并保留结构化信息(如章节层级、表格语义等),为Agent提供可导航的文档知识。项目采用Python monorepo结构,核心包括: apps/api:FastAPI服务,处理HTTP请求和流程调用 apps/worker:Celery服务,执行文档解析等耗时任务 packages/shared-python:共享基础设施层 课程明确了各层职责边界,并推

weixin_43674738的博客 153

查找与排序-交换排序(冒泡排序、快速排序)

交换排序是基于“比较”和“交换”两种操作来实现的排序方法。

2301_79744714的博客 1312

15、 深入理解Akka微服务:创建与管理体育博彩平台

本博文深入探讨了如何使用Akka微服务架构为体育博彩平台创建投影和管理事件数据,包括市场投影、投注投影以及数据库投影的实现。同时,介绍了通过gRPC提供HTTP端点以供外部系统访问的方法,并详细说明了在本地环境和Kubernetes中运行应用程序的步骤及配置建议。

weixin_35756624的博客 96

K8s-K8s部署Zookeeper+Kafka+ELFK+持久化数据

K8s环境下容器化部署`Zookeeper+Kafka+ELFK`日志收集系统

✅ 专注企业级 Linux/DevOps 运维的实战派 ✅ 已输出上百篇可落地方案 ✅ Shell 脚本开箱即用 ✅ K8s/YAML 环境验证 ✅ 故障排查链路完整复现 1916

C语言入门:冒泡法排序、交换法排序和选择法排序算法的详解(代码分析)

C语言入门:冒泡法排序、交换法排序和选择法排序算法的详解(代码分析)

2301_76380437的博客 3609

[系统安全] 一.什么是逆向分析、逆向分析基础及经典扫雷游戏逆向

娜璋AI安全之家于2020年8月18日开通,将专注于Python和安全技术,主要分享Web渗透、系统安全、CVE复现、威胁情报分析、人工智能、大数据分析、恶意代码检测等文章。真心想把自己近十年的所学所做所感分享出来,与大家一起进步。 系统安全系列作者将深入研究恶意样本分析、逆向分析、攻防实战等,通过在线笔记和实践操作的形式分享与博友们学习,希望能与您一起进步。第一篇文章先带领大家学习什么是逆向分析,然后详细讲解逆向分析的典型应用,接着通过OllyDbg工具逆向分析经典的游戏扫雷,再通过Cheat Engin

杨秀璋的专栏 2万+

09交换排序算法---冒泡排序和快速排序

文章目录一、冒泡排序1.1.时间空间复杂度分析二、快速排序2.1.快排的递归实现2.1.1.挖坑法2.1.2.左右指针法2.1.3.前后指针法2.2.快排的非递归实现2.2.1.挖坑法2.2.2.左右指针法2.2.3.前后指针法2.2.4.用栈实现非递归2.3.快排的优化2.3.1三数取中2.3.2.小区间优化2.4.时间空间复杂度分析 一、冒泡排序 冒泡排序应该是最简单也是最容易理解的一种排序算法,它的逻辑是每趟将最大的数移到数组的最右边: 我之前写过冒泡排序的详细说明,链接如下:冒泡排序 代码实现:

精致的灰的博客 4091

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

排序算法中——冒泡排序和快速排序

上篇介绍了排序算法中的插入,选择,希尔和堆排序,本篇讲主要讲解冒泡排序和快速排序。

2303_81060385的博客 5890

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

常见排序算法之交换排序——冒泡排序、快速排序

​ 哈喽大家好,我是保护小周ღ,本期为大家带来的是常见排序算法中的交换排序,主要有冒泡排序,快速排序,快排分享了三种算法:挖坑法,左右指针法,前后指针法,以及两种优化方式:解决快排最坏情况的“三数取中”,避免递归次数过多的"小区间优化",包您一看就会,快来试试吧~ ​......

保护小周ღ的博客 3985

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

[排序算法]冒泡排序+快速排序全梳理!

冒泡排序和快速排序

f_2789889770的博客 1734

【保姆级图解】交换排序 算法详解:直接冒泡排序、快速排序

选择基准:从待排序数组中选择一个元素作为基准(pivot)。分区操作:将数组分为两部分,使得左边部分的所有元素都小于等于基准,右边部分的所有元素都大于等于基准。递归排序:分别对左右两部分递归地进行快速排序。前后指针法是实现分区操作的一种有效方式。前后指针法是快速排序中一种简洁而有效的分区实现方式。它通过两个指针的移动和交换操作,将数组分为两部分,使得基准元素处于其最终的正确位置。虽然快速排序在平均情况下具有出色的性能,但在最坏情况下可能会出现性能退化的问题。

2501_90200491的博客 1740

交换排序—冒泡排序和快速排序

本文主要讲解冒泡排序和归并排序。

weixin_60718941的博客 2597

C++实现交换排序算法(冒泡排序、快速排序)

排序算法分为五大类,一共是有九种,如下: 插入类:直接插入排序、折半插入排序、希尔排序 交换类:冒泡排序、快速排序 选择类:简单选择排序、堆排序 归并类:二路归并排序 基数类:多关键字排序 九种算法的时间复杂度、空间复杂度和稳定性小结如下: 本文放出选择算法的两种排序算法代码。 冒泡排序 void BubbleSort(int R[], int n) { int i, j, temp, flag; cout << endl << "冒泡排序:" << endl;

qq_38222051的博客 3703

【CPP】交换排序:冒泡排序、快速排序

选择排序:冒泡排序、快速排序

BinaryWiker的博客 1489

交换排序算法:冒泡排序和快速排序

本篇博客主要介绍交换排序算法中的冒泡排序(BubbleSort)和快速排序(QuickSort),包括他们的思路和实现,另着重介绍快速排序的三种实现思路以及两个方面的优化。 代码实现:C语言

分享学习方面的一些笔记 1036

八大排序算法(2)交换排序-冒泡排序 和 快速排序

八大排序算法(2)交换排序-冒泡排序 和 快速排序

你要拥有一个你喜欢并且热爱的人生 8627

漫谈经典排序算法:三、冒泡排序 && 快速排序

1、序言 这是《漫谈经典排序算法系列》第三篇,先解析了冒泡排序,然后引出快速排序,给出了快速排序的两种实现版本。 各种排序算法的解析请参考如下: 《漫谈经典排序算法:一、从简单选择排序到堆排序的深度解析》 《漫谈经典排序算法:二、各种插入排序解析及性能比较》 《漫

Touch_2011的专栏 2万+

【Java常用排序算法】交换排序(冒泡排序、快速排序)

交换排序 冒泡排序 快速排序 Java实现

一个普本码农奋斗史 2204
上一篇: 如何发布一个npm包
下一篇: 详解排序算法(三)之2种选择排序(简单选择排序、堆排序)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值