浅解前端必须掌握的算法(一):冒泡排序

前言

虽然前端面试中不多会考到算法类的题目,可是你去大厂面试的时候就知道了,对基本算法的掌握对于从事计算机科学技术的咱们来讲,仍是必不可少的,天天花上 10 分钟,了解一下基本算法概念以及前端的实现方式。前端

另外,掌握了一些基本的算法实现,对于咱们平常开发来讲,也是如虎添翼,能让咱们的 js 业务逻辑更趋高效和流畅。面试

算法介绍

冒泡排序很简单,就是数组中的相邻元素,两两比较,数值或者 Unicode 码小的元素往前排。算法

冒泡算法排序图

具体实现指导以下:数组

  1. 比较相邻两个元素,若前一个比后一个大,则交换位置;
  2. 第一轮结束以后,最后一个元素的值是最大的;
  3. 接着开始第二轮,可是不用再比较最后一个元素了;
  4. 第一轮除外,之后的每一轮都比前一轮少比较一次;

具体实现

var bubbleSort = function (arr){
  var i, j, m;
  var len = arr.length;
  if (len <= 1) {
    return arr;
  }

  for (i=0; i<len-1; i++) {
    for (j=0; j<len-i-1; j++) {
      if (arr[j] > arr[j+1]) {
        m = arr[j];
        arr[j] = arr[j+1];
        arr[j+1] = m;
      }
    }
  }
  return arr;
};
复制代码

算法改进

若是数组本来的顺序就是冒泡的,又或者仅作完前面寥寥几回就已经达到效果了,那后续的比较工做就显得有些多余了,如何对以上算法进行改进?微信

咱们能够在某一轮的循环比较结束后,若是没有发生任何的元素交换,则能够认为该数组已经达到预期效果,没必要再继续下一轮的比较了。ui

var bubbleSort = function (arr){
  var start = +new Date();
  var i, j, m, noswap;
  var len = arr.length;
  if (len <= 1) {
    return arr;
  }

  for (i=0; i<len-1; i++) {
    noswap = true;
    for (j=0; j<len-i-1; j++) {
      if (arr[j] > arr[j+1]) {
        m = arr[j];
        arr[j] = arr[j+1];
        arr[j+1] = m;
        noswap = false;
      }
    }
    if (noswap) {
      break;
    }
  }

  // 当 arr 的长度越长,时间差越明显
  console.log(+new Date() - start);
  return arr;
};
复制代码

时间度复杂度分析

分析时间复杂度就按最坏的状况来,即待排序表是彻底逆序的状况。 假设数组中共有 n 个元素,第一轮须要比较 n-1 次,第二轮须要比较 n-2 次,第三轮须要比较 n-3 次,以此类推,最后一轮须要比较 1 次,共比较 n-1 轮,因此是个等差数列,运用等差数列求和公式,能计算出以下时间复杂度: spa

所以总的时间复杂度为 O(n²)3d


微信公众号
以为本文不错的话,分享一下给小伙伴吧~ code

相关文章
相关标签/搜索