c++排序算法——冒泡排序(不会的一定要看,超级详细)

简介: c++排序算法——冒泡排序(不会的一定要看,超级详细)

引入📕

今天,我们来学习一种排序算法——冒泡排序

首先,先问三个问题:

1.为什么要排序?🔥

想象一下,如果字典不是按照字母顺序排列,查找一个单词,你得查到什么时候?这就是为什么人们引入了分类的概念,因为其极大地帮助我们快速搜索物品

或者说,排序是一种常用的整理信息的方法。排序可克服资料混乱、不便交流、查阅困难、挑选或取舍困难、不便安排等等问题

2.有那些常用的排序算法?⌚

image.gif编辑

冒泡排序、选择排序、插入排序、归并排序等等都是常用的排序算法。

各种排序的复杂度、方式等方面都略有不同,下面这张图可以反映(图片参考自常用十大排序算法):

image.gif编辑

3.什么是冒泡排序?🔨

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

这是百度的说法,让我们来看看另一种说法。

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

来自《我的第一本算法书》。

总的来说,就是一句话:

通过不断比较相邻元素,将大的元素放到数组后面,最终完成排序。

这具体是什么原理呢?请看下面。


原理❓

文字解释📌

    1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
      1. 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
        1. 针对所有的元素重复以上的步骤,除了最后一个。
          1. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

          举个栗子(文字说明)👔

          对6 3 2 5 4 1 这个乱序数字串进行冒泡排序。

          第一步.3 2 5 4 1 6

          第二步.2 3 4 1 5 6

          第三步.2 3 1 4 5 6

          第四步.2 1 3 4 5 6

          第五步.1 2 3 4 5 6

          这样就完成了。

          举个栗子(图文混合说明)🌏

          注:此处与上面的排序不太一样,上面是把大的优先放在后面这是把小的依次放到前面。

          image.gif编辑

          在序列的最右边放置一个天平,比较天平两边的数字。如果右边的数字较小,就交换这两个数字的位置。

          image.gif编辑

          由于6<7,所以交换这两个数字。

          image.gif编辑

          完成后,天平往左移动一个位置,比较两个数 字的大小。此处4<6,所以无须交换。

          image.gif编辑

          继续将天平往左移动一个位置并比较数字。重复同样的操作直到天平到达序列最左边为止。

          image.gif编辑

          不断对数字进行交换,天平最终到达了最左边。通过这一系列操作,序列中最小的数字就会移动到最左边。

          image.gif编辑

          最左边的数字已经归位

          image.gif编辑

          将天平移回最右边,然后重复之前的操作,直到天平到达左边第2个位置为止

          image.gif编辑

          当天平到达左边第2个位置时,序列中第2小的数字也就到达了指定位置。

          image.gif编辑

          将天平再次移回最右边,重复同样的操作直到所有数字都归位为止

          image.gif编辑

          排序中…

          image.gif编辑

          排序完成。


          一些说明😱

          时间复杂度

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

          不过,交换数字的次数和输入数据的排列顺序有关。假设出现某种极端情况,如输 入数据正好以从小到大的顺序排列,那么便不需要任何交换操作;反过来,输入数据要 是以从大到小的顺序排列,那么每次比较数字后便都要进行交换。因此,冒泡排序的时间复杂度为O(n^2 )

          两种不同的比较方法

          相信大家都注意到了,文字说明与图文混合说明比较顺序是不同的。一个是把最大,第二大,第三大,...第n大依次放到后面;一个是把最小,第二小,...,第n小依次冒到前面。

          不过,它们都是冒泡排序


          程序实现💐

          注:此处用的是把最大,第二大,第三大,...第n大依次放到后面的冒泡顺序。

          步骤图

          image.gif编辑

          代码😇

          不用说了,很简单。(只插入中心部分)

          for(int i=n;i>=1;i--)
              {
                  for(int j=1;j<i;j++)
                  {
                      if(a[j]>a[j+1])
                      {
                          swap(a[j],a[j+1]);
                      }
                  }
              }

          image.gif


          优化👆

          问题

          数据的顺序排好之后,冒泡算法仍然会继续进行下一轮的比较。很显然,后面的比较没有意义的。

          解决办法📐

          设置bool变量flag(用于标记),如果发生了交换flag设置为true;如果没有交换就设置为false

          这样当一轮比较结束后如果flag仍为false,即:这一轮没有发生交换,说明数据的顺序已经排好,没有必要继续进行下去。那么,就可以结束排序了。


          最终代码🔭

          bool b;
              for(int i=n;i>=1;i--)
              {
                  b=false;
                  for(int j=1;j<i;j++)
                  {
                      if(a[j]>a[j+1])
                      {
                          swap(a[j],a[j+1]);
                          b=true;
                      }
                  }
                  if(b==false) break;
              }

          image.gif


          结语

          冒泡很简单,但是排序算法的基础。必须学会!

          相关文章
          |
          4月前
          |
          存储 监控 算法
          基于 C++ 哈希表算法实现局域网监控电脑屏幕的数据加速机制研究
          企业网络安全与办公管理需求日益复杂的学术语境下,局域网监控电脑屏幕作为保障信息安全、规范员工操作的重要手段,已然成为网络安全领域的关键研究对象。其作用类似网络空间中的 “电子眼”,实时捕获每台电脑屏幕上的操作动态。然而,面对海量监控数据,实现高效数据存储与快速检索,已成为提升监控系统性能的核心挑战。本文聚焦于 C++ 语言中的哈希表算法,深入探究其如何成为局域网监控电脑屏幕数据处理的 “加速引擎”,并通过详尽的代码示例,展现其强大功能与应用价值。
          99 2
          |
          5月前
          |
          存储 算法 C++
          Windows共享文件:探秘C++实现的B树索引算法奇境
          在数字化时代,Windows共享文件的高效管理至关重要。B树算法以其自平衡多路搜索特性,在文件索引与存储优化中表现出色。本文探讨B树在Windows共享文件中的应用,通过C++实现具体代码,展示其构建文件索引、优化数据存储的能力,提升文件检索效率。B树通过减少磁盘I/O操作,确保查询高效,为企业和个人提供流畅的文件共享体验。
          |
          6月前
          |
          存储 负载均衡 算法
          基于 C++ 语言的迪杰斯特拉算法在局域网计算机管理中的应用剖析
          在局域网计算机管理中,迪杰斯特拉算法用于优化网络路径、分配资源和定位故障节点,确保高效稳定的网络环境。该算法通过计算最短路径,提升数据传输速率与稳定性,实现负载均衡并快速排除故障。C++代码示例展示了其在网络模拟中的应用,为企业信息化建设提供有力支持。
          164 15
          |
          6月前
          |
          运维 监控 算法
          解读 C++ 助力的局域网监控电脑网络连接算法
          本文探讨了使用C++语言实现局域网监控电脑中网络连接监控的算法。通过将局域网的拓扑结构建模为图(Graph)数据结构,每台电脑作为顶点,网络连接作为边,可高效管理与监控动态变化的网络连接。文章展示了基于深度优先搜索(DFS)的连通性检测算法,用于判断两节点间是否存在路径,助力故障排查与流量优化。C++的高效性能结合图算法,为保障网络秩序与信息安全提供了坚实基础,未来可进一步优化以应对无线网络等新挑战。
          |
          6月前
          |
          存储 算法 数据处理
          公司局域网管理中的哈希表查找优化 C++ 算法探究
          在数字化办公环境中,公司局域网管理至关重要。哈希表作为一种高效的数据结构,通过哈希函数将关键值(如IP地址、账号)映射到数组索引,实现快速的插入、删除与查找操作。例如,在员工登录验证和设备信息管理中,哈希表能显著提升效率,避免传统线性查找的低效问题。本文以C++为例,展示了哈希表在局域网管理中的具体应用,包括设备MAC地址与IP分配的存储与查询,并探讨了优化哈希函数和扩容策略,确保网络管理高效准确。
          |
          2月前
          |
          搜索推荐 算法 Go
          Go语言数组排序(冒泡排序法)—— 用最直观的方式掌握排序算法
          本案例介绍使用冒泡排序对整数数组进行升序排序的实现方法,涵盖输入处理、错误检查与排序逻辑。通过代码演示和算法解析,帮助理解排序原理及Go语言切片操作,为学习更复杂排序算法打下基础。
          |
          2月前
          |
          搜索推荐
          冒泡排序与其它排序算法比较
          本内容比较了冒泡排序、选择排序和插入排序的特性。三者时间复杂度均为O(n²),但交换次数和稳定性不同。冒泡排序稳定,交换次数多,可优化至O(n);选择排序不稳定,交换次数少;插入排序交换次数最少,且二者均为稳定排序。对于有序数组,冒泡和插入可优化提升效率。
          42 0
          |
          2月前
          |
          存储 监控 算法
          基于跳表数据结构的企业局域网监控异常连接实时检测 C++ 算法研究
          跳表(Skip List)是一种基于概率的数据结构,适用于企业局域网监控中海量连接记录的高效处理。其通过多层索引机制实现快速查找、插入和删除操作,时间复杂度为 $O(\log n)$,优于链表和平衡树。跳表在异常连接识别、黑名单管理和历史记录溯源等场景中表现出色,具备实现简单、支持范围查询等优势,是企业网络监控中动态数据管理的理想选择。
          62 0
          |
          3月前
          |
          存储 机器学习/深度学习 算法
          基于 C++ 的局域网访问控制列表(ACL)实现及局域网限制上网软件算法研究
          本文探讨局域网限制上网软件中访问控制列表(ACL)的应用,分析其通过规则匹配管理网络资源访问的核心机制。基于C++实现ACL算法原型,展示其灵活性与安全性。文中强调ACL在企业与教育场景下的重要作用,并提出性能优化及结合机器学习等未来研究方向。
          90 4
          |
          4月前
          |
          监控 算法 数据处理
          基于 C++ 的 KD 树算法在监控局域网屏幕中的理论剖析与工程实践研究
          本文探讨了KD树在局域网屏幕监控中的应用,通过C++实现其构建与查询功能,显著提升多维数据处理效率。KD树作为一种二叉空间划分结构,适用于屏幕图像特征匹配、异常画面检测及数据压缩传输优化等场景。相比传统方法,基于KD树的方案检索效率提升2-3个数量级,但高维数据退化和动态更新等问题仍需进一步研究。未来可通过融合其他数据结构、引入深度学习及开发增量式更新算法等方式优化性能。
          131 17

          热门文章

          最新文章