当前位置:首页 » 《随便一记》 » 正文

【JavaScript】面试手写题精讲之数组(下)

6 人参与  2024年03月06日 11:21  分类 : 《随便一记》  评论

点击全文阅读


引入

这章主要讲的是数组的排序篇,我们知道面试的时候,数组的排序是经常出现的题目。所以这块还是有必要进行一下讲解的。笔者观察了下前端这块的常用算法排序题,大概可以分为如下

冒泡排–> 稳定排序插入排序–> 稳定排序选择排序–> 不稳定排序快速排序–> 不稳定排序

所以笔者在该章节只会讲解这4大排序算法的实现,至于有些读者问如果面试题出了其他的排序算法呢?例如希尔排序,堆排序等,我个人认为如果一家公司给候选人出堆排序,那我觉得他可能就不太想让候选人通过,如果出希尔排序,那我建议你这次面试可以不用面了,因为95%以上是KPI面试。

正文

冒泡排序

冒泡排序工作原理:

比较相邻的元素。如果第一个比第二个大,就交换它们两个。对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。针对所有的元素重复以上的步骤,除了最后一个。持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

时间复杂度: O ( n 2 ) O(n^2) O(n2)
代码如下:

function bubbleSort(arr) {  const len = arr.length;  for (let i = 0; i < len - 1; i++) {    // 每轮循环最后i个元素已经是有序的,所以内层循环可以减去i    for (let j = 0; j < len - 1 - i; j++) {      // 如果前一个元素大于后一个元素,则交换它们的位置      if (arr[j] > arr[j + 1]) {        const temp = arr[j];        arr[j] = arr[j + 1];        arr[j + 1] = temp;      }    }  }  return arr;}// 测试const arr = [2, 3, 1, 4, 5];console.log(bubbleSort(arr));// 输出: [1, 2, 3, 4, 5]

插入排序

插入排序工作原理:

从第一个元素开始,该元素可以认为已经被排序。取出下一个元素,在已经排序的元素序列中从后向前扫描。如果该元素(已排序)大于新元素,将该元素移到下一位置。重复步骤3,直到找到已排序的元素小于或者等于新元素的位置。将新元素插入到该位置后。重复步骤2~5。

时间复杂度: O ( n 2 ) O(n^2) O(n2)
代码如下:

function insertionSort(arr) {  const len = arr.length;  for (let i = 1; i < len; i++) {    const key = arr[i];    let j = i - 1;    // 将arr[i]元素移到已排序部分的正确位置    while (j >= 0 && arr[j] > key) {      arr[j + 1] = arr[j];      j--;    }    arr[j + 1] = key;  }  return arr;}// 测试const arr = [2, 3, 1, 4, 5];console.log(insertionSort(arr));// 输出: [1, 2, 3, 4, 5]

选择排序

选择排序工作原理:

在未排序序列中找到最小(或最大)元素,存放到排序序列的起始位置。再从剩余未排序元素中继续寻找最小(或最大)元素,然后放到已排序序列的末尾。重复第二步,直到所有元素均排序完毕。

时间复杂度: O ( n 2 ) O(n^2) O(n2)
代码如下:

function selectionSort(arr) {  const n = arr.length;  for (let i = 0; i < n; i++) {    let minIndex = i;    for (let j = i + 1; j < n; j++) {      if (arr[j] < arr[minIndex]) {        minIndex = j;      }    }    if (minIndex !== i) {      [arr[i], arr[minIndex]] = [arr[minIndex], arr[i]];    }  }  return arr;}// 测试const arr = [2, 3, 1, 4, 5];console.log(selectionSort(arr));// 输出: [1, 2, 3, 4, 5]

快速排序

快速排序工作原理:

从数列中挑出一个元素作为基准(pivot),通常选择第一个或最后一个元素。重新排列数列,所有比基准小的元素摆放在基准前面,所有比基准大的元素摆在基准后面(相同的数可以到任一边)。在这个分区结束之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序

时间复杂度: O ( n l o g n ) O(nlogn) O(nlogn)
代码如下:

function quickSort(arr) {  if (arr.length <= 1) {    return arr;  }  const pivot = arr[0];  const left = [];  const right = [];  for (let i = 1; i < arr.length; i++) {    if (arr[i] < pivot) {      left.push(arr[i]);    } else {      right.push(arr[i]);    }  }  return [...quickSort(left), pivot, ...quickSort(right)];}

点击全文阅读


本文链接:http://zhangshiyu.com/post/74539.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

最新文章

  • 微风轻拂又见你:+结局+番外(林书意陆沉)_微风轻拂又见你:+结局+番外(林书意陆沉)列表_笔趣阁(林书意陆沉)
  • 景清可入淮:结局+番外(姜以清萧景淮)_景清可入淮:结局+番外列表_笔趣阁(姜以清萧景淮)
  • 「爸爸和哥哥毁掉我嗓子后,我杀疯了」命运转折章节速览_[妹妹弟弟高昱宸]全章节免费阅读
  • [得知我是假千金,男友逼我被车碾压]免费_「任曼曼贺裕曼曼」完结
  • 「绑定吃瓜系统,满朝文武吓疯了」剧情悬念章节分段解锁_楚临情感冲突名场面试读章
  • 老公傍上富婆要跟我离婚,却不知富婆她爹是我家管家:结局+番外(老公傍上富婆要跟我离婚,却不知富婆她爹是我家管家:结局+番外)完结_(林立洋)列表_笔趣阁(老公傍上富婆要跟我离婚,却不知富婆她爹是我家管家:结局+番外)
  • (心的第七次颤动:结局+番外)高分完本书荒必读文(苏砚姜颜)_(心的第七次颤动:结局+番外)列表_笔趣阁(苏砚姜颜)
  • (番外)+(全书)时光负尽爱东流:结局+番外(顾洛琛温韵灵)完结_(顾洛琛温韵灵)列表_笔趣阁(时光负尽爱东流:结局+番外)
  • 全文癌症晚期,高冷老婆疯狂报复我纯净版:结局+番外(沈云汐傅南琛)列表_全文癌症晚期,高冷老婆疯狂报复我纯净版:结局+番外
  • 重生仙门,不要渣妻要飞升:结局+番外(温九安陆芙蕖)_重生仙门,不要渣妻要飞升:结局+番外
  • 重生归来,我放弃百万年薪摊煎饼(姜法医)_(重生归来,我放弃百万年薪摊煎饼)列表_笔趣阁(姜法医)
  • (番外)+(全书)周灵(害死姐姐被男友报复三年后,姐姐死而复生了)_(周灵)列表_笔趣阁(害死姐姐被男友报复三年后,姐姐死而复生了)

    关于我们 | 我要投稿 | 免责申明

    Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1