前端要掌握的几种排序算法

因为之前面试有问到快排,昨天笔试又有做到关于排序算法的题,所以特地看了一下关于排序算法。前端对算法的要求不高,但是下面这几种易理解的排序算法还是要掌握。

简单介绍及实现

以下的排序均是升序。

冒泡排序

冒泡排序是最简单的排序,即比较前后两个数的大小。

function bubble(arr) {
  for(let i = 0, len = arr.length; i < len; i++) {
    for(let j = 0; j < len; j++) {
      if(arr[j] > arr[j + 1]) {
        [arr[j], arr[j+1]] = [arr[j+1], arr[j]];
      }
    }
  }
  
  return arr;
}

选择排序

选择排序首先要选择一个最小值,拿这个最小值与后面未排序的数进行比较,比它更小则调换位置。

function selection(arr) {
  let min;
  for(let i = 0, len =arr.length; i < len; i++) {
    min = arr[i];
    for(let j = i+1; j < len; j++) {
      if(arr[j] < min) {
        [arr[i], arr[j]] = [arr[j], arr[i]];
      }
    }
  }
  
  return arr;
}

插入排序

插入排序原理与打扑克时候把牌按顺序插入差不多:从第二张牌开始往前看,数字是否小于第二张牌,处理完以后从第三张牌看,以此类推,从第 n 张牌往前看 n 前面的牌是否小于第 n 个位置的牌。

function insert(arr) {
  for(let i = 1, len = arr.length; i < len; i++) {
    let target = arr[i];
    for(let j = i; j >=0; j--) {
      if(arr[j-1] > target) {
        arr[j] = arr[j-1];
      } else {
        arr[j] = target;
        break;
      }
    }
  }
  
  return arr;
}

希尔排序

希尔排序是在插入排序的基础上改进的,它会设定一个间隔,而不是每次只有 1 的距离,间隔由大到小,最后为1。

在《算法(第四版)》中 Robert Sedgewick 提出了动态定义间隔序列。(为了方便理解,这里没有动态定义)

function shell(arr) {
  let gaps = [5, 3, 1];
  
  gaps.forEach((gap) => {
    for(let i = gap, len = arr.length; i < len; i++) {
      let target = arr[i];
      for(let j = i; j >=0; j -= gap) {
        if(arr[j - gap] > target) {
          arr[j] = arr[j - gap];
        } else {
          arr[j] = target;
          break;
        }
      }
    }
  });
  
  return arr;
}

快速排序

快速排序就是选定一个基准,然后把大于这个基准的作为一边,小于这个基准的作为另一边,再把这两边以相同的规则处理。类似于二分法。

function quick(arr) {
  if(arr <= 1) {
    return arr;
  }
  // 假定基准 mid 为 arr 的第一个数
  var mid = arr.shift();
  var left = [];
  var right = [];

  arr.forEach((value) => {
    if(value <= mid) {
      left.push(value);
    } else {
      right.push(value);
    }
  });

  return quick(left).concat(mid, quick(right));
}

归并排序

这个我也不好解释,复制官方的说法:

归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。

下面是我找的一个比较形象的演示了归并排序的图:

这里是一个图片演示
这里是一个图片演示
function merge(arr) {
  var len = arr.length;
  if(len <= 1) {
    return arr;
  }
  var midIndex = Math.floor(len/2);
  var left = arr.slice(0, midIndex);
  var right = arr.slice(midIndex);
  
  return mergeSort(merge(left), merge(right));
}

function mergeSort(left, right) {
  var res = [];
  while(left.length && right.length) {
    if(left[0] < right[0]) {
      res.push(left.shift());
    } else {
      res.push(right.shift());
    }
  }
  
  while(left.length) {
    res.push(left.shift());
  }
  while(right.length) {
    res.push(right.shift());
  }
  
  return res;
}

各个排序算法复杂度及稳定性的比较

算法类型 平均时间复杂度 最坏时间复杂度 最佳时间复杂度 空间复杂度 稳定性
冒泡排序 O(n2) O(n2) O(n) O(1) 稳定
选择排序 O(n2) O(n2) O(n2) O(1) 不稳定
插入排序 O(n2) O(n2) O(n) O(1) 稳定
希尔排序 O(nlogn) O(nlog2n) O(nlog2n) O(1) 不稳定
快速排序 O(nlogn) O(n2) O(nlogn) O(logn) 不稳定
归并排序 O(nlogn) O(nlogn) O(nlogn) O(n) 稳定
堆排序 O(nlogn) O(nlogn) O(nlogn) O(1) 不稳定

(目前还不能理解堆排序,有时间看完二叉树再研究一下堆排序会更新堆排序的内容。)

各类排序算法演示

点这里可以看各类排序算法演示

总结

前端要理解的算法虽然不多,但尽量多学习算法对一些代码优化有帮助,同时方便以后学习其他语言或者深入学习。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,761评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,953评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,998评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,248评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,130评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,145评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,550评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,236评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,510评论 1 291
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,601评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,376评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,247评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,613评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,911评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,191评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,532评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,739评论 2 335

推荐阅读更多精彩内容

  • Ba la la la ~ 读者朋友们,你们好啊,又到了冷锋时间,话不多说,发车! 1.冒泡排序(Bub...
    王饱饱阅读 1,779评论 0 7
  • 一. 写在前面 要学习算法,“排序”是一个回避不了的重要话题,在分析完并查集算法和常用数据结构之后,今天我们终于可...
    Leesper阅读 2,508评论 0 40
  • 某次二面时,面试官问起Js排序问题,吾绞尽脑汁回答了几种,深感算法有很大的问题,所以总计一下! 排序算法说明 (1...
    流浪的先知阅读 1,184评论 0 4
  • 那些欢笑,那些眼泪,那些万水千山,那些执迷不悔…… 一切的一切,喷薄欲出,那些风里的歌,歌里的梦,统统都是青春剧本...
    梦1212阅读 305评论 0 0
  • 这副画是宝大概一个月前在家中画的。现在看看,仍觉得可爱有加,不知道的以为是小老鼠在吃猫妈妈的奶。看着宝现在的画作,...
    feirenff阅读 186评论 0 0