冒泡排序算法(排序算法的应用场景)

冒泡排序算法(排序算法的应用场景)

说说冒泡排序的理解?如何实现?应用场景?

  原标题:说说冒泡排序的理解?如何实现?应用场景?

  一、冒泡排序是什么

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

  冒泡排序的思想就是在每次遍历一遍未排序的数列之后,将一个数据元素浮上去(也就是排好了一个数据)

  如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”

  假如我们要把 12、35、99、18、76 这 5 个数从大到小进行排序,那么数越大,越需要把它放在前面

  思路如下:

  从后开始遍历,首先比较 18 和 76,发现 76 比 18 大,就把两个数交换顺序,得到 12、35、99、76、18

  接着比较 76 和 99,发现 76 比 99 小,所以不用交换顺序

  接着比较 99 和 35,发现 99 比 35 大,交换顺序

  接着比较 99 和 12,发现 99 比 12 大,交换顺序

  最终第 1 趟排序的结果变成了 99、12、35、76、18,如下图所示:

  上述可以看到,经过第一趟的排序,可以得到最大的元素,接下来第二趟排序则对剩下的的4个元素进行排序,如下图所示:

  经过第 2 趟排序,结果为 99、76、12、35、18

  然后开始第3趟的排序,结果为99、76、35、12、18

  然后第四趟排序结果为99、76、35、18、12

  经过 4 趟排序之后,只剩一个 12 需要排序了,这时已经没有可比较的元素了,这时排序完成

  二、如何实现

  如果要实现一个从小到大的排序,算法原理如下:

  首先比较相邻的元素,如果第一个元素比第二个元素大,则交换它们

  针对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对,这样,最后的元素会是最大的数

  针对所有的元素重复以上的步骤,除了最后一个

  持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较

  function bubbleSort(arr) {

  const len = arr.length;

  for (let i = 0; i < len – 1; i++) {

  for (let j = 0; j < len – 1 – i; j++) {

  if (arr[j] > arr[j+1]) { // 相邻元素两两对比

  var temp = arr[j+1]; // 元素交换

  arr[j+1] = arr[j];

  arr[j] = temp;

  }

  }

  }

  return arr;

  }

  可以看到:冒泡排序在每一轮排序中都会使一个元素排到一趟, 也就是最终需要 n-1 轮这样的排序

  而在每轮排序中都需要对相邻的两个元素进行比较,在最坏的情况下,每次比较之后都需要交换位置,此时时间复杂度为O(n^2)

  优化

  对冒泡排序常见的改进方法是加入一标志性变量exchange,用于标志某一趟排序过程中是否有数据交换

  如果进行某一趟排序时并没有进行数据交换,则说明数据已经按要求排列好,可立即结束排序,避免不必要的比较过程

  可以设置一标志性变量pos,用于记录每趟排序中最后一次进行交换的位置,由于pos位置之后的记录均已交换到位,故在进行下一趟排序时只要扫描到pos位置即可,如下:

  function bubbleSort1(arr){

  const i=arr.length-1;//初始时,最后位置保持不变

  while(i>0){

  let pos = 0;//每趟开始时,无记录交换

  for(let j = 0; j < i; j++){

  if(arr[j] > arr[j+1]){

  let tmp = arr[j];

  arr[j] = arr[j+1];

  arr[j+1] = tmp;

  pos = j;//记录最后交换的位置

  }

  }

  i = pos;//为下一趟排序作准备

  }

  return arr;

  }

  在待排序的数列有序的情况下,只需要一轮排序并且不用交换,此时情况最好,时间复杂度为O(n)

  并且从上述比较中看到,只有后一个元素比前面的元素大(小)时才会对它们交换位置并向上冒出,对于同样大小的元素,是不需要交换位置的,所以对于同样大小的元素来说,相对位置是不会改变的,因此, 冒泡排序是稳定的

  三、应用场景

  冒泡排的核心部分是双重嵌套循环, 时间复杂度是 O(N 2 ),相比其它排序算法,这是一个相对较高的时间复杂度,一般情况不推荐使用,由于冒泡排序的简洁性,通常被用来对于程序设计入门的学生介绍算法的概念

  更多冒泡排序实战案例可以到bj.tedu.cn进行观看

  责任编辑:

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/23577.html

(0)
上一篇 2023-10-23
下一篇 2023-10-24

相关推荐

  • NestJS实战06-定时任务

    NestJS实战06-定时任务概要 前面几章完成了,当日任务和长期目标的基础模块,现在我将要完成定时任务模块。就像我一开始介绍的那样,我要对我每天没有完成的任务,或者长期目标没有达成的情况下,发送电子邮件来提醒我。 如果大家时间充

    2023-11-15
    69
  • mysql安装(mysql8.0.34安装教程)

    mysql安装(mysql8.0.34安装教程)

    2023-08-26
    89
  • Java集合框架-Collection01-堆栈

    Java集合框架-Collection01-堆栈开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第2天。[点击查看活动详情] 目录 一:堆栈 二:接口 1.Collection接口 ​编辑 集合中只能添加引用类型数据 List接

    2023-11-17
    68
  • Mysql事务超时「建议收藏」

    Mysql事务超时「建议收藏」本文概览:介绍了超时有关的概念:@Transaction的timeout、mybatis的timeout、mysql的innodb_lock_wait_timeout。1问题1.1背景在一个事务中完成解析一个大文件,分批存入到数据库。遇到问题,执行时间比较长,就讨论了事务超时的问题,担心执行时间太长,事务超时自动回滚了。为了考虑这个问题,需要考虑如下超时相关的设置:一个事务的超时时间。spring的@Transactional 一个stametn的执行时间。包括mybais的tim

    2023-04-02
    87
  • 关于MySQL的知识点与面试常见问题都在这里

    关于MySQL的知识点与面试常见问题都在这里字符集指的是一种从二进制编码到某类字符符号的映射。校对规则则是指某种字符集下的排序规则。Mysql中每一种字符集都会对应一系列的校对规则。 Mysql采用的是类似继承的方式指定字符集的默认值,每个数据库以及每张数据表都有自己的默认值,他们逐层继承。比如:某个库中所有表的默认字符…

    2023-04-02
    97
  • Java基础!堆空间和堆栈详解

    Java基础!堆空间和堆栈详解Java堆空间 Java运行时空间由Java运行时用于为Objects和JRE类分配内存。每当我们创建任何对象时,它总是在堆空间中创建。 垃圾收集在堆内存上运行,以释放没有任何引用的对象使用的内存。在

    2023-11-15
    66
  • 爬虫Python代码_python开源代码

    爬虫Python代码_python开源代码python爬虫爬虫的概念爬虫是模拟浏览器发送请求,获取响应爬虫的流程发送请求获取响应提取数据保存请求头通过请求头模拟模拟服务器Host。

    2022-12-14
    102
  • 温温的go编程学习笔记(1)

    温温的go编程学习笔记(1)“github.com/gogf/gf/v2/os/genv”用法总结:一般不用 new 来新建变量,凡遇到 chan、map 和 slice

    2022-12-14
    93