首页 > 编程语言 >js带注释的冒泡排序算法

js带注释的冒泡排序算法

时间:2024-04-17 11:23:16浏览次数:13  
标签:队列 元素 冒泡排序 js 算法 let 排序 data

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

第一种:常规方法冒泡排序

比较相邻的两个元素,如果前一个比后一个大,则交换位置。
第一轮把最大的元素放到了最后面。
由于每次排序最后一个都是最大的,所以之后按照步骤1排序最后一个元素不用比,最理想的情况是已经按顺序排好的队列,只需要扫描一次就结束并且不需要做任何位置交换,复杂度为O(n); 最差为O(n2)

function bubbleSort(data){

  if(data.length<1) return data;

  let n = data.length;

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

    //因为扫描完一次后,最后一个不用比了,所以要n-i进行边界处理,达到优化性能目的

    for(let j=0;j<n-i; j++){
      if(data[j]>data[j+1]){

        // 交换函数
        let swap = data[j];

        data[j] = data[j+1];

        data[j+1] = swap;

      }

    }
  }

  return data;

}

 

第二种: 对冒泡排序的改进

声明一个变量标记顺序是否发生变化

function bubbleSort(data){
  let n = data.length;

  let flag = true

  let swap

  // 只要存在位置更换就进入循环

  while(flag){

    flag = false

    // 每次排序最后一个都是最大的, 所有循环结束后,就得到了升序队列。

    for(let i=0;i<n;i++){
     if(data[i]>data[i+1]){

       // 交换函数

       swap = data[i]

       data[i]  = data[i+1]
       data[i+1] = swap;

       flag = true;

     }

    }

    // /因为扫描完一次后,最后一个不用比了,所以要n--进行边界处理,达到优化性能目的

    n--;

  }

  return data;
}

第三种: 也是对冒泡排序的一种改进

第一遍排序时将数据分成两部分,一部分比另一部分的所有数据都要小。然后递归调用,在两边都实行排序。

function bubbleSort(data) {

  // 队列只有一个数或者没有数,返回原队列
  if(data.length <= 1) {
    return data
  }
  // 在队列中向取整,找到一个理论上的中间值索引
  let pIndex = Math.floor(data.length/2)

  // 从原队列中删除该中间值,并且取出该值。
  let p = data.splice(pIndex, 1)[0]

  // 小于中间值的左边部分
  let left = []

  // 大于中间值的右边部分
  let right = []

  // 通过扫描已经删除了中间值的队列,分别得到小于中间值的左边部分和大于中间值的左边部分
  for(var i = 0; i<data.length; i++) {
    if(data[i] < p) {
      left.push(data[i])
    } else {
      right.push(data[i])
    }
  }
  // 分别递归左边,右边
  let nLeft = bubbleSort(left);
  let nRight =  bubbleSort(right)

  // 返回新的队列
  return nLeft.concat([p], nRight);
}

 

标签:队列,元素,冒泡排序,js,算法,let,排序,data
From: https://www.cnblogs.com/worldforest/p/18140134

相关文章

  • 基于Redis实现基本抢红包算法
    简介:[key,value]的缓存数据库,Redis官方性能描述非常高,所以面对高并发场景,使用Redis来克服高并发压力是一个不错的手段,本文主要基于Redis来实现基本的抢红包系统设计.发红包模块:1:发红包模块流程图如下:  用户首先输入红包金额和红包个数,然后生成当前红......
  • JS 移除对象数组中,属性值全为空的项
    constarray=[{id:1,name:'John',age:25},{id:2,name:'Alice',age:null},{id:3,name:'Bob',age:undefined},{id:4,name:'Eve',age:''},{id:5,name:'',age:......
  • vue dayjs 安装指定版本
    在Vue项目中安装指定版本的Day.js库,你可以使用npm或者yarn。以下是安装指定版本Day.js的步骤:打开终端(命令行)。转到你的Vue项目目录。执行以下命令,其中x.x.x替换为你想要安装的Day.js版本号。使用npm安装指定版本的Day.js:[email protected] 或者使用......
  • day14_我的Java学习笔记 (常用API、Lambda、常见算法)
    1.常用API1.1Date类【案例】:计算出当前时间往后走1小时121秒之后的时间是多少。1.2SimpleDateFormat【练习】:秒杀活动1.3Calendar2.JDK8新增日期类2.1概述、LocalTime/LocalDate/LocalDateTime2.2Ins......
  • 基于yolov2深度学习网络的螺丝螺母识别算法matlab仿真
    1.算法运行效果图预览 2.算法运行软件版本matlab2022a 3.算法理论概述      在工业自动化和质量控制领域,准确且高效的螺丝螺母识别至关重要。深度学习方法,特别是基于卷积神经网络(CNN)的目标检测技术,因其卓越的特征提取能力,成为解决此类问题的有效手段。YOLOv2......
  • mybatilsplus属性为json类型的坑
    最近做的一个项目由于需要把json类型字段在springboot+mybatisplus的框架中。实体类上的jsonobject死活存不进数据库,总结出一下经验1.实体类上:@TableName(value="mix_target",autoResultMap=true)2.自定义Hander:自定义实现AbstractJsonTypeHandler(mybatilsplus里面带了......
  • 30 天精通 RxJS (22):Subject 基本观念
    终于进到了RxJS的第二个重点Subject,不知道读者们有没有发现?我们在这篇文章之前的范例,每个observable都只订阅了一次,而实际上observable是可以多次订阅的Multiplesubscriptionsvarsource=Rx.Observable.interval(1000).take(3)varobserverA={ next:(value......
  • 30 天精通 RxJS (21):深入 Observable
    我们已经把绝大部分的operators都介绍完了,但一直没有机会好好的解释Observable的operators运行方式。在系列文章的一开头是以数组(Array)的operators(map,filter,concatAll)作为切入点,让读者们在学习observable时会更容易接受跟理解,但实际上observable的oper......
  • 新a_bogus算法还原大赏
    **新a_bogus算法还原大赏**记得加我我们的学习群哦:`529528142`1、本次新ab是继承之前旧ab的过程,新ab分为上半部分和下半部分,上半部分是之前的旧ab,下半部分我们开始讲解。![请添加图片描述](https://img-blog.csdnimg.cn/direct/726d949cf2e546618f0a38fb989ee9b0.png)```jss.ap......
  • package.json
     Node项目在项目根目录中名为 package.json 的文件中跟踪依赖关系和元数据。这是你项目的核心。它包含名称、描述和版本之类的信息,以及运行、开发以及有选择地将项目发布到 npm 所需的信息。在本教程中,我们将:了解 package.json 与项目之间的关系确定重要字段和......