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

引入

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

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

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

正文

冒泡排序

冒泡排序工作原理:

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

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

function bubbleSort(arr) {const len = arr.length;for (let i = 0; i < len - 1; i++) {// 每轮循环最后i个元素已经是有序的,所以内层循环可以减去ifor (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]

插入排序

插入排序工作原理:

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

选择排序

选择排序工作原理:

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

时间复杂度: 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]

快速排序

快速排序工作原理:

  1. 从数列中挑出一个元素作为基准(pivot),通常选择第一个或最后一个元素。
  2. 重新排列数列,所有比基准小的元素摆放在基准前面,所有比基准大的元素摆在基准后面(相同的数可以到任一边)。在这个分区结束之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
  3. 递归地(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://www.hqwc.cn/news/474352.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

EasyRecovery软件免费版与付费版有哪些功能区别?

免费版的EasyRecovery软件在功能和恢复能力上确实存在一些限制。 首先&#xff0c;在数据恢复方面&#xff0c;免费版通常只能恢复最多1GB的数据。这意味着&#xff0c;如果你需要恢复的数据量超过1GB&#xff0c;你将需要升级到付费版才能完全恢复。 其次&#xff0c;免费版…

Packet content transfer stopped (received 8 bytes)

esp32烧录程序时报错&#xff1a;A fatal error occurred: Packet content transfer stopped (received 8 bytes) 解决方法&#xff1a; 降低上传速度&#xff0c;使用115200&#xff1b;更换flash模式&#xff0c;使用DIO方式重试如果还不行&#xff0c;检查flash连接情况&am…

第11章 GUI

11.1 Swing概述 Swing是Java语言开发图形化界面的一个工具包。它以抽象窗口工具包&#xff08;AWT&#xff09;为基础&#xff0c;使跨平台应用程序可以使用可插拔的外观风格。Swing拥有丰富的库和组件&#xff0c;使用非常灵活&#xff0c;开发人员只用很少的代码就可以创建出…

基于协同过滤的时尚穿搭推荐系统

项目&#xff1a;基于协同过滤的时尚穿搭推荐系统 摘 要 基于协同过滤的时尚穿搭推荐系统是一种能自动从网络上收集信息的工具&#xff0c;可根据用户的需求定向采集特定数据信息的工具&#xff0c;本项目通过研究服饰流行的分析和预测的分析和预测信息可视化时尚穿搭推荐系统…

电阻器的脉冲浪涌能力?

由于现有需求&#xff0c;许多现代电子电路和设备都会经历瞬态脉冲和浪涌。这反过来又导致需要“设计”瞬态浪涌保护&#xff0c;尤其是在电机控制器等电路中。当电机启动时&#xff0c;此时消耗的电流过大&#xff0c;可能导致电阻器故障。同样&#xff0c;如果电容器用于电机…

数学实验第三版(主编:李继成 赵小艳)课后练习答案(十三)(2)

实验十三&#xff1a;数据拟合与数据差值 练习二 1.在飞机的机翼加工时,由于机翼的尺寸很大,所以通常在图纸上只能标出部分关键点的尺寸某型号飞机的机翼上缘轮廓线的部分数据如下: x 0 4.74 9.05 19 38 76 95 114 133 152 171 190 y 0 5.23 8.1 11.97 16.…

单片机移植Lua(STM32H743移植Lua-5.4.6)

文章目录 目的移植演示示例链接更多说明合理设置内存大小按需加载标准库实现系统和IO接口设置引用路径 总结 目的 通常单片机都是使用C/C来开发的&#xff0c;任何修改都需要重新编译固件然后下载运行。在一些需要灵活性更强的场合中可以内嵌Lua解释器实现动态更新应用程序的功…

【Langchain Agent研究】SalesGPT项目介绍(二)

【Langchain Agent研究】SalesGPT项目介绍&#xff08;一&#xff09;-CSDN博客 上节课&#xff0c;我们介绍了SalesGPT他的业务流程和技术架构&#xff0c;这节课&#xff0c;我们来关注一下他的项目整体结构、poetry工具和一些工程项目相关的设计。 项目整体结构介绍 我们把…

java的面向对象编程(oop)——认识枚举

前言 打好基础&#xff0c;daydayup! 枚举 1&#xff0c;认识枚举&#xff1a; 枚举是一种特殊类&#xff0c;用enum语句修饰。与普通类不同的是&#xff1a;枚举类的第一行只能写一些合法的标识符&#xff08;名称&#xff09;&#xff0c;多个名称用逗号隔开。这些标识符&a…

Python学习路线图

防止忘记&#xff0c;温故知新 进阶路线

计算机设计大赛 深度学习YOLO抽烟行为检测 - python opencv

文章目录 1 前言1 课题背景2 实现效果3 Yolov5算法3.1 简介3.2 相关技术 4 数据集处理及实验5 部分核心代码6 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于深度学习YOLO抽烟行为检测 该项目较为新颖&#xff0c;适合作为竞赛课…

【C++初阶】第三站:类和对象(中) -- 日期计算器

目录 前言 日期类的声明.h 日期类的实现.cpp 获取某年某月的天数 全缺省的构造函数 拷贝构造函数 打印函数 日期 天数 日期 天数 日期 - 天数 日期 - 天数 前置 后置 前置 -- 后置-- 日期类中比较运算符的重载 <运算符重载 运算符重载 ! 运算符重载 …