前端面试题解密:经典算法之冒泡算法(ES6版)及优化

前言

随着前端的飞速发展,前端业务开发给前端工程师提出了更高的要求,因而算法题也越来越高频次的出现在前端面试中。有很多的小伙伴找胡哥苦诉,在前端实际开发中(除了涉及游戏开发方面),算法使用有很多吗?大厂的面试是故意要自我标榜下吗?其实不然,考核算法还是相当有必要的,来来来,让胡哥给你拯救世界的理由,哦,不,是考核算法的理由。

为啥要考算法?

  1. 算法是通用技能,包含了诸多逻辑和相关的技术点,优秀的算法方案会体现出优秀的逻辑思维和和解决问题的能力。

  2. 扎实的算法有助于我们在解决复杂问题时获得更优的解决方案。

算法的实现基于不同的语言有不同的形式,对于JavaScript来说,算法的实现也有很多种不同的方式,本文基于JS最新的ES6语法来实现,各位小伙伴在领略算法魅力的同时也能掌握到ES6的语法。

一、冒泡算法

冒泡算法,闻名而知其意,使用类似于水中气泡自下而上逐渐变大的原理(这个原理要是有不清楚的童鞋,可咨询物理老师压强问题,看看老师会不会把你打出shi来...)来对数组进行排序。

排序规则

  1. 每次循环,比较当前位置项与下一个位置项的大小,如果当前项 > 后一项,则交换两者的位置。每次循环比较都能选择出一个最大值,放在末尾,剩余待筛选的比较项就减少一项。

  2. 如果数组存在n项,那么需要循环执行筛选的次数为n次

二、冒泡算法代码实现

function bubbleSort ([...arr]) {
  for (let i = 0; i < arr.length; i++) {
    // 第j和j+1项比较,故j的最大值为 = 最大长度 - 1 - 减去已经执行筛选的轮数i
    for (let j = 0; j < arr.length - 1 - i; j++) {
      if (arr[j] > arr[j + 1]) {
        // 交换数组元素的位置
        [arr[j + 1], arr[j]] = [arr[j], arr[j + 1]]
      }
    }
  }
  return arr
}

let arr = [4, 3, 2, 1]

// 输出排序结果
let sortArr = bubbleSort(arr)
console.log(sortArr) // [1, 2, 3, 4]
// 输出原数组
console.log(arr) // [4, 3, 2, 1]

ES6语法结构

  1. 函数定义时形参:[...arr]

    解构赋值和扩展运算符,为不影响原数组,使用该方式接收原数组元素
  2. [arr[j + 1], arr[j]] = [arr[j], arr[j + 1]]表达式

    利用数组的解构赋值,交换两个位置的值
    [a, b] = [b, a]
    这样就不必借助于第三个变量来交换值

三、冒泡算法优化

使用上面的方式来实现冒泡算法排序时,时间平均复杂度为O(n^2),那最坏的情况是什么呢?传入的数组完全是逆序的,即[4, 3, 2, 1]。但是如果传入的数组[1, 2, 3, 4]是完全正序的呢?如果还按该方式,那在执行时是性能浪费的,那该如何优化呢?

优化方案

如果数组是完全顺序的,那就说明在执行一次循环比较时,没有数组元素被交换位置,所以我们来设置一个标志flag,初始化为true,如果存在交换则赋值为false。在一次循环后,如果标志为true,则表示为无交换,已经是完全顺序了,则可以break停止外层循环了。下面我们来看下代码实现。

function bubbleSort ([...arr]) {
  for (let i = 0; i < arr.length; i++) {
    // 设置标记,标记当前轮筛选时是否有交换位置元素,默认为true,如果有交换设置为false
    let flag = true

    // 第j和j+1项比较,故j的最大值为 最大长度 - 1 - 减去已经执行筛选的轮数i
    for (let j = 0; j < arr.length - 1 - i; j++) {
      if (arr[j] > arr[j + 1]) {
        // 交换数组元素的位置
        [arr[j + 1], arr[j]] = [arr[j], arr[j + 1]]

        // 有交换位置,设置标记为false
        flag = false
      }
    }

    // 如果当前轮比较时没有交换位置,说明已经排序完成了
    if (flag) {
      break
    }
  }
  return arr
}

let arr = [1, 2, 3, 4]
// 输出排序结果
let sortArr = bubbleSort(arr)
console.log(sortArr) // [1, 2, 3, 4]
// 输出原数组
console.log(arr) // [1, 2, 3, 4]

此时在完成排序时,只执行了一次循环,此刻的时间复杂度为O(n)

(0)

相关推荐

  • es6新增新特性简要总结

    es6简介 es6是在2015年6月正式颁布的新标准,es6基本上实现了所有ECMAScript 规范,以后每年的6月都会发布新版本,但改动不大. let 变量 使用let 关键字来申明的变量拥有以下 ...

  • 前端笔试题——数组去重(保姆级手撕)

    引言: 对于传统的前端工程师来说,更多的只是把服务端响应的数据渲染到页面上. 随着前端的不断进化,算法对我们而言也日渐重要,大公司为了优中选优,经常也会用算法题去筛选更优秀的人才. 算法,或许在工作中 ...

  • 面试官在“逗”你系列:不借助第三变量交换两个变量值的方案你有几种?

    引言 在我们学习编程之初,就学习过变量的赋值操作,同时也学习了将一个变量的值赋值给另外一个变量.对于交换两个变量的值,很多童鞋都有解决方案.然鹅,对于面试官提出的不借助第三变量来交换两个变量的值,你能 ...

  • 35.数组.选择排序

    选择排序: 第一轮: 第0个与第1个比, 如果  第0个 > 第1个  那就交换位置,第0个再与第2个比...... 第二轮: 第1个与第2比, ...................直到排序完 ...

  • es6 快速入门 系列 —— 解构

    解构 我们经常使用数组或对象存储数据,然后从中提取出相关数据信息 试图解决的问题 以前开发者为了从对象或数组中提取出特定数据并赋值给变量,编写了很多重复的代码,就像这样: function demo1 ...

  • ES6新增数组的方法

    es6新增数组操作方法 在我们拿到后端数据的时候,可能会对数据进行一些筛选.过滤,传统的做法如下 // 取出数组中name为kele的数组集合 let a = [ { name: 'kele', ti ...

  • 解密经典指标短线卖出技巧 看到卖出股票

    卖出时机 1.大盘行情形成大头部时,坚决清仓全部卖出.上证指数或深综合指数大幅上扬后,形成中期大头部时,是卖出股票的关键时刻. 2.大幅上升后,成交量大幅放大,是卖出股票的关键时机.当股价大幅上扬之后 ...

  • 【试题解密】01等高线地形图的判读分层训练

    解密01等高线地形图的判读分层训练 [基础巩固] 1.下图中虚线或字母表示地形部位.下列选项中,地形部位名称排序与图序相符的是( ) A.①山谷②山谷③山顶④鞍部B.①山谷②山脊③鞍部④山顶 C.①山 ...

  • 【试题解密】02地球的运动分层训练

    解密02地球的运动分层训练 [基础巩固] 1.北半球某地某天正午太阳高度角为90°,该地可能处于() A.5°N-15°N之间B.25°N-35°N之间 C.44°N-55°N之间D.65°N-75° ...

  • Python|概述“冒泡算法”

    引言在生活中,水中的气泡常常冒出水面,似乎它们会自动排序,其实在算法排序中,也有着一种类似的算法,这就是今天要引入的算法-"冒泡算法".冒泡算法,顾名思义,就是保证每个数据像水中的 ...

  • 七大经典、常用排序算法的原理、Java 实现以及算法分析

    0. 前言 大家好,我是多选参数的程序锅,一个正在 neng 操作系统.学数据结构和算法以及 Java 的硬核菜鸡.数据结构和算法是我准备新开的坑,主要是因为自己在这块确实很弱,需要大补(残废了一般) ...

  • 医药魔方招聘:JAVA工程师、前端架构师、爬虫架构师、算法研究员、测试工程师

    医药魔方致力于以数据解读行业.以数据助力行业.以数据引领行业,促进医药行业生态更加高效.透明和公平. 医药魔方已经建立了系统化的数据标准,贯通了研发情报.专利文献.临床研究.注册批准.技术交易.市场准 ...

  • 算法面试题一:排序算法及贪心算法

    这里介绍排序算法及贪心算法的个人解决方法 题目一:数组排序 给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度. 示例 1: 给定数组 nums = ...

  • 最经典最新的图像去噪算法

    图像去噪是非常基础也是非常必要的研究,去噪常常在更高级的图像处理之前进行,是图像处理的基础.可惜的是,目前去噪算法并没有很好的解决方案,实际应用中,更多的是在效果和运算复杂度之间求得一个平衡,再一次验 ...