排序算法之冒泡排序(详细版)

📝个人主页:爱吃炫迈
💌系列专栏:数据结构与算法
🧑‍💻座右铭:快给我点赞赞💗


冒泡排序是什么

冒泡排序(Bubble Sort)***,是一种计算机科学领域的较简单的排序算法。

  • 重复地走访过要排序的元素列表,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行,直到没有相邻元素需要交换,也就是说该元素列已经排序完成。

  • 这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”

💯只说可能有点不好理解,所以我们上动图,更形象的演示冒泡排序规则(向了解的更细致请往下看!)

20210509190446264


算法原理

冒泡排序算法的原理如下:

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

算法实现

🌰🌰举个栗子:用冒泡排序算法实现数组a = [2,3,1]的升序排序

image-20230404210504707

🥇开始排序(比赛开始咯~):

  1. a[0]和a[1]进行比大小,结果2<3,所以不进行交换

image-20230404210625835

  1. a[1]和a[2]进行比大小,结果3<1,进行交换

image-20230404210809789

  1. 经过两次比较后,最大值3已经成功冒泡到最后~~🎉🎉🎉不用在参与后续的排序啦🎉🎉🎉

image-20230404211232327

🥇第一轮比赛结束!下面进行第二轮!

  1. a[0]和a[1]进行比大小,结果2>1,进行交换

image-20230404211600751

  1. 经过一次比较后,2也成功冒泡,🎉🎉🎉也不用参与后续的比较了!🎉🎉🎉

image-20230404211813590

🥇此时就剩1了,没有人在和它进行比较了,比赛结束!

总结:3个数进行比较时,我们进行了2趟排序(即2轮比赛):

第1趟排序,我们进行了2次比较

第2趟排序,我们进行了1次比较

推理n个数进行比较时,我们进行了(n-1)趟排序(即(n-1)轮比赛)因为最后总是剩下一个数不需要在进行一趟排序(冒泡)

第1趟排序,我们进行了(n-1)次比较

第2趟排序,我们进行了(n-1) -1次比较因为第一趟后选出的最大值不在参与排序,所以第二趟只剩n-1个数参与排序,而n-1个数需要进行(n-1)-1次比较

第3趟排序,我们进行了(n-2)-1次比较

·····

i趟排序,我们进行了(n-i)次比较 因为(n-(i-1))-1=n-i

结论

  1. n个数进行比较时,我们进行了(n-1)趟排序
  2. 第i趟排序,我们进行了(n-i)次比较

💫所以现在我们可以明明白白,清清楚楚(···没词儿了···)的写出代码啦:

 function bubbleSort(arr) {
  var i, j;
  //定义一个临时变量,用于交换时存放数据
  var tempExchangVal;
 // 外层循环表示冒泡排序的趟数
 // 内层循环表示每趟排序比较的次数
  for (i = 0; i < arr.length - 1; i++) {
    for (j = 0; j < arr.length - 1 - i; j++) {
    //交换相邻的两个顺序错误的数字
      if (arr[j] > arr[j + 1]) {
        tempExchangVal = arr[j];
        arr[j] = arr[j + 1];
        arr[j + 1] = tempExchangVal;
      }
    }
  }
  return arr;
}
 var arr = [2, 3, 1];
 var arrSorted = bubbleSort(arr);
 console.log(arrSorted); 🎉//输出1,2,3🎉

💗总结💗

你以为到这里就结束了吗,nonono,后续我还会补充有关冒泡排序的例题,敬请期待吧~~
最后希望我的这篇文章对你学习冒泡排序有所帮助,有问题欢迎在评论区提出!

  • 39
    点赞
  • 102
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱吃炫迈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值