深入浅出“冒泡排序”

【十分钟学个算法】· 冒泡排序算法 一、冒泡排序的诞生 / 第一个应用场景 1960年,英国计算机科学家霍尔在参加英国国家物理实验室的俄文机械翻译项目时,为了提高翻译效率而提出冒泡排序(只存在此说法,无实证)。 当时俄文到英文的词汇列表是以字母顺序存储在一条长磁带中,翻译词汇时需遍历磁带,从而获取译文。当有一整段俄文句子需要翻译时,为了提高效率,往往将句子的词按照字母顺序先行排序,这样就能只遍历一遍磁带,就获得译文。 例如一个有5个词组成的俄文句子,如果不提前排序,需要遍历5遍磁带才能获得... 阅读详情

0.前言

冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。
它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。
走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端,故名。

正如百度百科中的所说,我们的冒泡排序是一种非常基础的一种算法,虽然在日常的工作中的使用的情况较少,但是由于其入门简单,逻辑清楚,还是非常适合初学者作为一个基础算法的入门,所以我们今天就一起来看一看,冒泡排序到底是怎么回事。

下面引用一下知乎用户可可的话术。

想想有一群泡泡
其中一个泡泡跑到一个泡小妹说,小妹小妹你过来咱俩比比谁大,小妹说哇你好大,于是他跑到了泡小妹前面,又跟前面的一个泡大哥说,大哥,咱俩比比谁大呗。泡大哥看了他一眼他就老实了。这就是内层的for,那个泡泡跟每个人都比一次。
话说那个泡泡刚老实下来,另一个泡泡又开始跟别人比谁大了,这就是外层的for,每个泡泡都会做一次跟其他泡泡比个没完的事。

注意,以下代码部分由 JS 代码进行展示。

1.如何实现排序

既然我们想要进行排序,那么我们首先必须要有一个基础的数组,然而这个数组的情况可能会存在很多种,这里我们暂时只讨论最复杂的情况。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>

</body>
<script type="text/javascript">
    // 声明一个最糟糕情况的数组
    var arr = [9,8,7,6,5,4,3,2,1];
</script>
</html>

注意,我在这里声明了一个非常糟糕的数组,也就是说,数组中的每一个内容都需要进行排序。

既然我们有了这么一个基础的数组,我们就可以正式开始对我们的内容进行排序了。

根据冒泡排序的思想,我们每一次循环,都将数组中最大的那个数字,放在数组的最后。

这样就可以保证我们的数组中,每次循环中的最大的那个都在后面,这样全部循环一次之后,我们的内容也就全部排序完毕了。

具体实现可以参考下面的图片。

第一次循环的时候,将数组中最大的那个内容放在程序的最后面。

这是我们第一次交换数组中内容,那么我们交换了几次呢?

我们总共交换了 8 次。

因为倒数第二次的时候,我们的 1 和 9 就已经排序完毕了,而最后的数字 9 不需要我们再交换一次,所以最后交换次数是 8 次。

而第二次交换呢?

我们同样需要将数组中最大的哪一个数字挪动到数组的最后一位,这个时候,我们需要挪动几次呢?

我们的交换次数相比于上面的情况再次减少一次,现在总共挪动了 7 次。

以此类推,我们可以想象出来,挪动的次数应该如同下面这张图一样。

我们的数组长度为 9。

我们外层的循环数,第一次将数组中最大的一位数字挪动到最后面,第二次挪动第二大的数字,第三次第三大数字,……,直到我们最后将所有的内容全部挪动完毕。

那么我们可以得出一个结论,我们需要挪动的次数是 数组的长度 - 1 次。

也就是说,我们可以去使用一个循环。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>

</body>
<script type="text/javascript">
    var arr = [9,8,7,6,5,4,3,2,1];
    // 外层控制的循环的次数,看我这里需要循环几次
    for(var i = 0; i < arr.length - 1; i++){
        document.write('<br>');
    }
</script>
</html>

我们知道了我们这个数组需要循环几次,那么我们现在怎么控制我们需要在内部需要挪动几次呢?

这时候我们就要使用到内部的一层循环了。

我们可以在我们内层的循环中去控制我们的程序中间需要挪动几次。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>

</body>
<script type="text/javascript">
    var arr = [9,8,7,6,5,4,3,2,1];
    // 外层控制的循环的次数,看我这里需要循环几次
    for(var i = 0; i < arr.length - 1; i++){
        // 内层控制数组内的循环次数
        for(var j = 0; j < arr.length -i -1; j++){
            document.write(arr + '<br>');
        }
        document.write('<br>');
    }

</script>
</html>

这时候我们就已经将我们的数组中每一个元素都能依次查找到了,可是我们的冒泡循环不是为了进行排序么?

这时候我们需要将大的数字挪动到后面。

那么我们该怎么做呢?

我们需要将两个元素进行交换,那么怎么交换呢?

我们可以再次声明一个变量,这样将两个数字进行交换了。

            // 进行内容的交换
            if(arr[j] > arr[j + 1]){
                var temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }

这时候我们将之前的所有的内容进行合并,我们可以通过双重循环,将前后的数字和在它后面的数字进行交换。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>

</body>
<script type="text/javascript">
    var arr = [9,8,7,6,5,4,3,2,1];
    // 外层控制的循环的次数,看我这里需要循环几次
    for(var i = 0; i < arr.length - 1; i++){
        // 内层控制数组内的循环次数
        for(var j = 0; j < arr.length -i -1; j++){
            // 进行内容的交换
            if(arr[j] > arr[j + 1]){
                var temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
            document.write(arr + '<br>');
        }
        document.write('<br>');
    }

</script>
</html>

这样当我们循环结束之后,我们的数字也就正好全部替换完成了。

2.后续

其实我们现在表示的,是冒泡排序中最糟糕的情况,每一个数字都需要进行交换,但是我们日常工作中可能不是所有的数字都需要进行排列。

有一部分的数字已经是全部排序好的,这时候我们不需要完全进行排序。

那该怎么办呢?

其实我们可以去定义一个变量,专门用于记录当前这个循环是否进行了循环,如果当前内层循环中,一次交换也没有发生,那么是不是就证明我们这个序列已经排序完毕了呢?

这样我们就可以去判断我们的变量,去看看我们的循环是否可以结束。

今天时间有限,就不去书写具体的代码了,大家可以在网上简单搜索一下,冒泡排序优化,自己试着去看看,怎么去将这个东西进行优化吧!~

《画解数据结构》「冒泡排序」算法教程 比算法更重要的是「 算法思维 」 阅读详情

相关推荐

冒泡排序(Bubble Sort)

冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。 它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果他们的顺序(如从大到小、首字母从A到Z)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素已经排序完成。 这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。

【八大经典排序算法】冒泡排序

冒泡排序由于其简单和易于理解,使其成为初学者学习排序算法的首选,也是初学者接触到的第一个排序算法。其原理是通过重复交换相邻的元素来将最大的元素逐步“冒泡”到最后。冒泡排序由美国计算机科学家冯·诺伊曼(John von Neumann)于1945年提出。冯·诺伊曼是计算机科学和现代计算机体系结构的奠基人之一,他在设计计算机算法时,意识到排序是计算机科学中的一个基本问题。于是,他提出了冒泡排序算法。冒泡排序的思想是基于比较相邻元素的大小,如果顺序不正确,则交换它们的位置。

Zhenyu_Coder的博客 2059

TIA博途-冒泡排序SCL算法-全局FC库文件-V15版本.zip

TIA博途_冒泡排序SCL算法_全局FC库文件_V15版本

java经典排序算法---冒泡排序

首先理解定义(百度百科) 冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。 它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。 这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。 举个简单的例子:一组数据 2,1,9,7,3...

weixin_45808875的博客 327

C语言实现冒泡排序算法

冒泡排序(Bubble Sort),是一种计算机科学领域的较简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。

Goose开源程序本地机上 AI 代理,能够从头到尾自动执行复杂的开发任务。Goose 不仅可以提供代码建议,还可以自主构建整个项目、编写和执行代码、调试故障、编排工作流程以及与外部 API 交互

Goose开源程序 是您的本机上 AI 代理,能够从头到尾自动执行复杂的开发任务。Goose 不仅可以提供代码建议,还可以自主构建整个项目、编写和执行代码、调试故障、编排工作流程以及与外部 API 交互。无论您是在构建想法原型、优化现有代码,还是管理复杂的工程管道,goose 都能适应您的工作流程并精确执行任务。

struggle2025的博客 2045

utf-32/utf-16/utf-8如何解析Unicode编码呢?以及BOM的作用

一:UTF-32 这个最简单,就是字符编号的整数二进制形式,四个字节。 但有个细节,就是字节的排列顺序,如果第一个字节是整数二进制中的最高位,最后一个字节是整数二进制中的最低位,那这种字节序就叫"大端”(Big Endian, BE),否则,正好相反的情况,就叫小端”(Little Endian, LE)。对应的编码方式分别是UTF-32BE和UTE-32LE。比如 注意:之所以有大端和小端两种方式,是因为硬件读写顺序的不同。 大端:数据的高字节保存在内存的低地址中,低字节保存到内存的高地址中,和.

向上的"狼"的博客 1640

告别ROS1思维:在ROS2 Humble上,用Python搞定MoveIt2机械臂控制的完整流程

本文详细介绍了在ROS2 Humble环境下使用Python控制MoveIt2机械臂的完整流程。从环境配置、架构变革到实战操作,涵盖URDF适配、Action接口编程及性能优化技巧,帮助开发者高效迁移ROS1项目至ROS2平台,实现工业级机械臂控制。

weixin_30352645的博客 450

「数据结构」室友打一把王者就学会了冒泡排序算法

【数据结构初阶】第三篇——八大经典排序算法之交换排序总结(图解+动图演示+代码实现+八大排序比较)

Edison's 小宇宙 1万+

eLabRadio软件无线电虚实结合仿真开发平台简介

在使用仿真平台时,不要关闭设备或断开设备与PC机之间的网络连接,否则,仿真平台将无法正常工作。注:采用eNodeX设备认证方式,当出现“设备不存在”的报错时,请检查计算机IP是否和硬件设备IP处于同一网段,或者是否是先连接好网线,再开启硬件设备的。①此登录方式下,需要先建立软件与硬件的通信:在登录窗口点击【网络配置】,参照下图输入设备IP,服务器地址无需设置,设置完成后点击确认,此时登录界面无需设置账号密码;,拷贝到电脑上,使用管理员权限运行setup.exe,下一步直到安装完成,桌面会生成快捷方式。

weixin_55349105的博客 6319

从KVM虚拟化到Openstack云化架构综述

目录 摘要 OpenStack的虚拟化技术 OpenStack架构介绍 Nova Swift KeyStone Neutron Glance Cinder Ceilometer Heat 摘要 这两年的工作中,接触到公有云和私有云的项目还不少。起初对于Openstack的了解,仅停留在其几大组件的交互上,如Nova、Neutron、Glance等,以及对各大云厂商功能点上...

liyunpeng229的博客 2051

深入浅出冒泡排序

本文深入浅出地解析了冒泡排序的双层循环逻辑。通过生活类比(钟表秒针与分针)、反例分析和边界条件拆解,阐明外层循环控制轮数、内层循环执行相邻比较的本质。重点解释了内层循环边界j<n-1-i的优化意义,并给出C语言实现代码及带标志位的优化版本。文章指出冒泡排序最坏时间复杂度为O(n²),但优化后最好情况可达O(n),最后强调通过单步调试观察变量变化是彻底理解算法的关键。全文以通俗易懂的方式破解了初学者对嵌套循环的困惑。

C++ 是一门不原谅粗心的语言,而我恰好喜欢这种不原谅。 我是 x,正在成为更严谨的 C++ 开发工程师的路上。 293

手把手教你用AD9834 DDS模块DIY一个可调信号源(附AD原理图/PCB/程序)

本文详细介绍了如何使用AD9834 DDS模块DIY一个高精度可调信号源,涵盖硬件搭建、原理图解读、PCB优化和程序烧录等关键步骤。通过STM32控制实现0-10MHz频率范围输出,特别适合电子设计与射频实验,提供完整的AD原理图、PCB设计和程序代码参考。

weixin_31854867的博客 408

深入浅出冒泡排序:从原理到代码实现(附三种语言示例)

冒泡排序(Bubble Sort)是一种基础的排序算法,其核心原理是反复比较相邻元素并交换位置,直到整个数组有序。

锦鲤的博客 1204

深入剖析 Hive 中 CASE WHEN 与 IF 函数的性能差异:解锁高效数据处理的关键

CASE WHEN 函数堪称 Hive 中条件判断的多面手,它具备两种强大的语法形式,以应对各种复杂的业务逻辑。简单 CASE 表达式这种形式适用于对某一列的值进行直接的条件匹配。其语法如下:END例如,我们有一个记录学生成绩的表CASE scoreELSE 'D'搜索 CASE 表达式当业务逻辑需要更灵活的条件判断时,搜索 CASE 表达式便派上用场。它的语法为:CASEENDCASEELSE 'D'

2401_83088008的博客 1125

RT-DETR改进策略【Conv和Transformer】| ICCV-2023 iRMB 倒置残差移动块 轻量化的注意力模块

本文记录的是利用模块优化的目标检测网络模型。的作用在于克服了常见模块无法同时吸收CNN 效率建模局部特征和利用Transformer 动态建模能力学习长距离交互的问题。相比一些复杂结构或多个混合模块的方法,能更好地权衡模型成本和精度。本文将其用于的模型改进和二次创新,更好地突出重要特征,提升模型性能。Rethinking Mobile Block for Efficient Attention-based Models从微观角度看,由和组成。及其改进的实现代码如下: 四、创新模块 4.1 改进点1⭐ 模块

Limiiiing的博客 816

深入浅出的排序算法-冒泡排序

关注我,每天都有优质技术文章推送,工作,学习累了的时候放松一下自己。 本篇文章同步微信公众号 欢迎大家关注我的微信公众号:「醉翁猫咪」 今天讲讲排序,说要讲就讲,走起冒泡排序:什么是冒泡排序呢?(bubble sort)你是怎么理解冒泡排序算法的呢,有什么可以一下懂得?为什么这个排序要叫冒泡呢?为什么不叫其他名词呢?其实这个取名是根据排序算法的基本思路命名的,见名知意,冒泡排序,就是想泡泡在水里一...

程序员哆啦A梦,蓝胖子 506

[Dify实战]插件编写- 如何让插件直接输出文件对象(支持 TXT、Excel 等)

本文介绍了在Dify插件中实现文件对象返回的方法。通过create_blob_message()函数,开发者可以输出txt、Excel等格式文件,让用户直接下载而非复制文本。文章详细讲解了二进制文件生成的原理,提供了文本翻译和Excel报表生成的代码示例,并列出常见MIME类型对照表。这种技术能显著提升插件实用性,特别适用于翻译、报表生成等需要文件输出的场景,使交互体验从"复制粘贴"升级为"一键下载"。

技术小甜甜:传播可落地技术,帮助个人和企业降低解决真实场景问题的成本 1249

简述冒泡排序

初学编程的小白来说,当学到数组和循环后,我们都会接触到排序算法的概念。排序算法常用的有10种,下面我就简单的描述一下冒泡排序这种简单容易理解的算法。 冒泡排序属于比较算法,是稳定的算法,选择算法是不稳定的算法。冒泡排序是一种极其简单的排序算法,它重复地遍历过要排序的数组元素,依次比较相邻两个元素,如果他们的顺序(从小到大或者从大到小)错误就把他们调换过来,直到遍历到最后一个元素且没有元素再需要交换,排序完成。这个算法操作起来,越小(或越大)的元素会经由交换慢慢“浮”到数列的顶端,像气泡一样按大小的气泡一个

BigData_Hubert的博客 1764

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

深入浅出冒泡排序:原理、实现与优化(附C++代码)

本文介绍了经典的冒泡排序算法,通过相邻元素比较交换将无序元素逐步"冒泡"到正确位置。文章详细解析了算法原理,以[5,3,8,4,2]为例演示排序过程,提供了基础版和优化版(添加有序标记)的C++实现代码。性能分析表明冒泡排序时间复杂度最坏O(n²),最好O(n),空间复杂度O(1),是稳定的原地排序算法。虽然效率不高,但原理简单易懂,适合算法学习入门和小规模数据排序,特别是接近有序的数据集。

qq_43402143的博客 722

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

深入浅出冒泡排序:从奶茶店到代码实现

冒泡排序虽不是最高效的算法,但其简洁性和教学价值使其在计算机科学中占据独特地位。正如Dijkstra所说:"简单性不是目标,而是副产品"。理解冒泡排序的过程,正是打开算法世界大门的第一把钥匙。​互动思考​:如果奶茶店每小时新增1000个订单,您会选择哪种排序算法?欢迎在评论区分享观点!

feng99520的博客 812

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

算法之冒泡排序

在众多算法排序之中冒泡排序是最容易理解也是最简单的。首先我们编写一个排序算法先要理解其原理我们才能更好的对其编写。 冒泡排序之所以称为冒泡是因为其排序时候的特征,因为它的特征就是每一趟排序都会找出一个数组中最大的值或者是最小的值,就跟水里的气泡一样冒出来。简单的来说如果一个数组里有5个数字,需要对其排序,使用冒泡排序的话第一趟排序下来便可以确定一个最大的数或者是一个最小的数,那么第二趟便可以确定一...

盗帅 219

我用一张图彻底理解了冒泡排序

本博文介绍最常被提起的排序算法:冒泡排序。冒泡排序是入门排序算法,思路比较常规,但确是最耗时的排序算法,所以听到冒泡排序笑一笑就好了,千万不要拿来装B。

youif的博客 544

C 语言中如何进行冒泡排序?

冒泡排序(Bubble Sort)是排序算法里面比较简单的一个排序。它重复地走访要排序的数列,一次比较两个数据元素,如果顺序不对则进行交换,并一直重复这样的走访操作,直到没有要交换的数据元素为止。冒泡排序的基本思想是通过相邻元素的两两比较,将最大(或最小)的元素逐步“浮”到数组的一端。 假设我们要对一个整数数组进行升序排序。在每一轮比较中,从数组的第一个元素开始,依次比较相邻的两个元素,如果前一个元素大于后一个元素,则交换它们的位置。这样,在第一轮比较结束后,最大的元素就会“浮”到数组的末尾。然后,对除了

技术笔记 2308

从简单开始,冒泡排序的思路、实现、优化

一、什么是排序算法? 顾名思义,排序算法就是将一组数据按照某种比较方法进行排序的算法,是一种算法。 例如数据是一组数字,通过排序算法可以将这组数字由小到大或由大到小排列。 例如一组数字:5,8,9,6,3,2,4,1,7。 输入排序算法后得到:1,2,3,4,5,6,7,8,9。 ps:在排序算法中只使用运算符和自己实现的方法,不然是犯规的哦~ 基础的排序算法:冒泡排序,选择排序,插入排序等。 进阶的排序算法还有:希尔排序,归并排序,桶排序,计数排序等等。 附:排序算法的稳定...

m0_56371721的博客 2037
上一篇: 五分钟学会 Canvas 基础(二)
下一篇: 关于前端界面兼容性,你想知道的都在这里!
MR_LP
博客等级 码龄11年 236粉丝 89原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值