作为初级前端面试,一般算法问题考的不多,但是如果考算法的话,数组排序被问到的概率是非常大的,本文介绍几种排序方案。

一、冒泡排序

最基本也是最经典的排序算法。利用双层for循环,外层控制比较趟数,内层控制当前这一趟比较的次数,相邻的两个数互相比较,如果前一个数比后一个数大,那就直接交换,以此类推,每一趟比较都能确定当前的最大值,所以就会像冒泡一样将比较大的数冒泡到最后,从而排好序。

1234567891011121314
function sort1 (arr) {  var len = arr.length  for (var i = 0; i < arr.length; i++) {    for (var j = 0; j < arr.length - i - 1; j++) {      if (arr[j] > arr[j+1]) {        var temp = arr[j+1]        arr[j+1] = arr[j]        arr[j] = temp      }    }  }  return arr}console.log(sort1([2,4,32,4,6,9,8])) // [2, 4, 4, 6, 8, 9, 32]

二、选择排序

选择排序相较冒泡排序没有那么激进,选择排序在比较的过程中只是记录当前最小值所在的索引,一趟结束以后判断最小值索引如果不是一开始假设的值,那就将最小索引所在的值交换到这一趟的最前面去,从而完成排序。

1234567891011121314151617
function sort2 (arr) {  for (var i = 0; i < arr.length - 1; i++) {    var minIndex = i    for (var j = i + 1; j < arr.length; j++) {      if (arr[j] < arr[minIndex]) {        minIndex = j      }    }    if (minIndex !== i) {      var temp = arr[i]      arr[i] = arr[minIndex]      arr[minIndex] = temp    }  }  return arr}console.log(sort2([2,4,32,4,6,9,8])) // [2, 4, 4, 6, 8, 9, 32]

三、快速排序

找一个基准值,将数组中比基准值小的放入左边,比基准值大的放入右边,然后将左右两部分继续找基准值再分成两部分,依次递归下去,直到不能再拆分为止(数组length为1),就排好序了。

123456789101112131415161718
function sort3 (arr) {          if (arr.length <= 1) {                return arr  }   var num = Math.floor(arr.length / 2)  var centerVal = arr.splice(num, 1)  var left = []    var right = []  for (var i = 0; i < arr.length; i++) {    if (arr[i] < centerVal[0]) {      left.push(arr[i])    }else{      right.push(arr[i])    }  }  return sort3(left).concat(centerVal, sort3(right)) }console.log(sort3([2,4,32,4,6,9,8])) // [2, 4, 4, 6, 8, 9, 32]

四、插入排序

依次往后遍历,将遍历到的数和前面的数从后往前依次比较,如果当前数比前面的某个数要大,那就说明当前数应该在的位置就是这个数的后面。

12345678910111213
function sort4 (arr) {  for (var i = 1; i < arr.length; i++) {    var preIndex = i - 1    var current = arr[i]    while (preIndex >= 0 && arr[preIndex] > current) {      arr[preIndex + 1] = arr[preIndex]      preIndex--    }    arr[preIndex + 1] = current  }  return arr}console.log(sort4([2,4,32,4,6,9,8])) // [2, 4, 4, 6, 8, 9, 32]

五、希尔排序

插入排序的改进版,分组做插入排序。通过对增量gap的控制实现对分组的细化,最后完成排序。

1234567891011121314151617
function sort5 (arr) {  var gap = 1  while (gap < arr.length / 5) {    gap = gap * 5 + 1  }  for (; gap > 0; gap = Math.floor(gap / 5)) {    for (var i = gap; i < arr.length; i++) {      var temp = arr[i]      for (var j = i - gap; j >= 0 && arr[j] > temp; j -= gap) {        arr[j + gap] = arr[j]      }      arr[j + gap] = temp    }  }  return arr}console.log(sort5([2,4,32,4,6,9,8])) // [2, 4, 4, 6, 8, 9, 32]

六、堆排序

利用堆(一棵顺序存储的完全二叉树)来完成堆数组的排序。

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
function sort6 (arr) {  // 初始化大顶堆,从第一个非叶子结点开始  for (let i = Math.floor(arr.length / 2 - 1); i >= 0; i--) {    adjustHeap(arr, i, arr.length)  }  // 排序,每一次for循环找出一个当前最大值,数组长度减一  for(let i = Math.floor(arr.length - 1); i > 0; i--) {    // 根节点与最后一个节点交换    swap(arr, 0, i)    // 从根节点开始调整,并且最后一个结点已经为当前最大值,不需要再参与比较,所以第三个参数为 i,即比较到最后一个结点前一个即可    adjustHeap(arr, 0, i)  }  return arr}// 交换两个节点function swap(arr, i, j) {  let temp = arr[i]  arr[i] = arr[j]  arr[j] = temp}// 将 i 结点以下的堆整理为大顶堆,注意这一步实现的基础实际上是:// 假设 结点 i 以下的子堆已经是一个大顶堆,adjustheap 函数实现的// 功能是实际上是:找到 结点 i 在包括结点 i 的堆中的正确位置。后面// 将写一个 for 循环,从第一个非叶子结点开始,对每一个非叶子结点// 都执行 adjustheap 操作,所以就满足了结点 i 以下的子堆已经是一大顶堆function adjustHeap(arr, i, length) {  // 当前父节点  let temp = arr[i]   // j  for(let j = 2 * i + 1; j < length; j = 2 * j + 1) {    // 将 arr[i] 取出,整个过程相当于找到 arr[i] 应处于的位置    temp = arr[i]     if(j+1 < length && arr[j] < arr[j+1]) {      // 找到两个孩子中较大的一个,再与父节点比较      j++    }    // 如果父节点小于子节点:交换;否则跳出    if(temp < arr[j]) {      swap(arr, i, j)      // 交换后,temp 的下标变为 j      i = j    } else {      break    }  }}console.log(sort6([2,4,32,4,6,9,8])) // [2, 4, 4, 6, 8, 9, 32]

七、sort

使用数组的API sort实现排序。

1234
function sort7 (arr) {  return arr.sort((a, b) => a - b)}console.log(sort7([2,4,32,4,6,9,8])) // [2, 4, 4, 6, 8, 9, 32]

代码不是万能的,但不写代码是万万不能的

2020/11/18 Dary记

相关推荐:

Javascript算法 — 数组去重

    Javascript算法 — 数组扁平化

JavaScript内置对象 — Math数学对象

HTTP请求完整过程以及头信息深入解析正则表达式防抖和节流

6 volist双层数组_Javascript算法 — 数组排序相关推荐

  1. .net 遍历数组找重复值写入一个新数组_面试 | 数组类算法精析

    点击上方蓝字设为星标 每周一.三.五上午 8:30 准时推送 下面开始今天的学习- 面试中的算法问题,有很多并不需要复杂的数据结构支撑.就是用数组,就能考察出很多东西了.其实,经典的排序问题,二分搜索 ...

  2. JavaScript数组去重算法实例

    本文主要介绍了JavaScript数组去重算法,结合实例形式总结分析了JavaScript数组去重相关的读写.遍历.比较.排序等操作及算法改进相关实现技巧,需要的朋友可以参考下 测试用例: arr = ...

  3. JS数组去重算法实现

    1.遍历数组法 最简单的去重方法, 实现思路:新建一新数组,遍历传入数组,值不在新数组就加入该新数组中:注意点:判断值是否在数组的方法"indexOf"是ECMAScript5 方 ...

  4. VB数组快速排序算法

    VB数组排序模块,使用的是快速排序法,支持 Variant.Double.Long.String--等多种数据类型数组排序. Option Explicit Private Sub Quicksort ...

  5. Algorithm:C+语言实现之数组相关算法(和为定值的两个数、和为定值的m个数、荷兰国旗、长度为2n的洗牌算法、任意长度数组的洗牌算法)

    Algorithm:C+语言实现之数组相关算法(和为定值的两个数.和为定值的m个数.荷兰国旗.长度为2n的洗牌算法.任意长度数组的洗牌算法) 目录 数组 1.寻找和为定值的两个数 2.和为定值的m个数 ...

  6. js实现数组降维算法[不准用Array.prototype.flat的api]

    js实现数组降维算法[不准用Array.prototype.flat的api] // target要降维的元素,n降维阶数,newArr存储结果的新数组 function f(target, n = ...

  7. 那些有关求解next数组的算法

    next数组的历史 有关字符串的模式匹配算法中,比较容易写出的是朴素的匹配算法也就是一种暴力求解方式,但是由于其时间复杂度为子串长度和主串长度的乘积,例如strlen(subStr) = n,strl ...

  8. 数据结构概念及连续存储数组的算法演示

    一.数据结构的概念: 我们如何把现实中大量而复杂的问题以特定的数据类型和特定的存储结构保存到主存储器(内存)中,以及在此基础上为实现某个功能(比如查找某个元素,删除某个元素,对所有元素进行排序),而执 ...

  9. python:实现9×9二维数组数独算法(附完整源码)

    python:实现9×9二维数组数独算法 from __future__ import annotationsMatrix = list[list[int]]# assigning initial v ...

最新文章

  1. 如何在HTML页面中插入百度地图
  2. k8s kafka集群 连接不上_图解 K8s 核心概念和术语
  3. linux的gromacs模拟分子运动,分子动力学技术交流---gromacsamber
  4. QLineEdit学习
  5. python 完全面向对象_Python面向对象
  6. [深度学习] 自然语言处理 --- Bert开发实战 (Transformers)
  7. 天天说常识推理,究竟常识是什么?
  8. 基于JAVA+SpringMVC+Mybatis+MYSQL的旅游管理系统
  9. 带宽和下载速率的关系
  10. java statemachine_StateMachine 状态机机制深入解析
  11. Linux——系统引导流程学习简单笔记
  12. 让 Code Review成为一种习惯
  13. xp系统计算机蓝屏,XP电脑蓝屏错误代码0*0000007E该怎么解决?
  14. 《大道至简》第二章(是懒人创造了方法)读后感
  15. Java——将汉字转为汉语拼音工具类
  16. 问题小结:解决Ubuntu18.04系统无法连接WIFI
  17. RK3588 烧写固件
  18. Qt编写安防视频监控系统2-视频播放
  19. 用C实现每天一个小游戏——第一天(飞机大战)
  20. python语言控制nao行走

热门文章

  1. zhajinhua2012邮件等网络服务的广泛应用
  2. 作为一个女程序员,无奈!
  3. 一个25岁董事长给程序员的18条忠告
  4. 前端们等了8年!HTML5标准终于完工了
  5. php 不申明构造函数,PHP的构造函数和同类名函数同时申明时调用的情况
  6. mac升级php后旧版本还在,Mac下更新自带的PHP版本
  7. 这么做科研你也能成功!
  8. 吃鱼可以不挑刺了?华中农业大学发现鳊鱼肌间刺表达基因,可培育“无刺鱼”...
  9. 哈佛大学单细胞课程|笔记汇总 (八)
  10. 教你Mac电脑复制手机粘贴的隐藏玩法