默认情况下,sort() 会将元素转换为字符串,然后按照 Unicode 编码的顺序进行排序:

const fruits = ['apple', 'banana', 'cherry', 'date'];
fruits.sort();
console.log(fruits); // 输出: ["apple", "banana", "cherry", "date"]

直接使用默认排序对数字进行排序可能会得到不符合预期的结果,因为它会按字符串比较
为了正确排序数字或实现自定义排序规则,可以向 sort() 传递一个比较函数
比较函数接收两个参数(通常称为 a 和 b),并返回一个数值:

  • 如果返回值 小于 0:a 会被排在 b 前面
  • 如果返回值 等于 0:a 和 b 的相对位置不变
  • 如果返回值 大于 0:b 会被排在 a 前面
//升序
arr.sort((a,b)=>{return a-b
})

基础排序

冒泡排序

我们分最好、最坏和平均来看:

  • 最好时间复杂度:它对应的是数组本身有序这种情况。在这种情况下,我们只需要作比较(n-1 次),而不需要做交换。时间复杂度为 O(n)
  • 最坏时间复杂度: 它对应的是数组完全逆序这种情况。在这种情况下,每一轮内层循环都要执行,重复的总次数是 n(n-1)/2 次,因此时间复杂度是 O(n^2)
  • 平均时间复杂度:这个东西比较难搞,它涉及到一些概率论的知识。实际面试的时候也不会有面试官摁着你让你算这个,这里记住平均时间复杂度是 O(n^2) 即可。
function bubbleSort(arr) {let len = arr.length;for (let i = 0; i < len; i++) {for(let j=0;j<len-i-1;j++){if(arr[j]>arr[j+1]){[arr[j],arr[j+1]] = [arr[j+1],arr[j]]}}}console.log(arr);}
//改进版 最好的时间复杂度 O(n)function bubbleSort2(arr) {let len = arr.length;for (let i = 0; i < len; i++) {//增加标志位let flag = false;for(let j=0;j<len-i-1;j++){if(arr[j]>arr[j+1]){flag = true;[arr[j],arr[j+1]] = [arr[j+1],arr[j]]}}//一次交换都没发生,说明数组是有序的if(!flag){break;}}console.log(arr);}

选择排序

选择排序的三个时间复杂度都对应两层循环消耗的时间量级: O(n^2)。

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

插入排序

插入排序的核心,找到元素在它前面的那个序列中的正确位置
正确地定位当前元素在有序序列里的位置、不断扩大有序数组的范围,最终达到完全排序的目的

  • 最好时间复杂度:它对应的数组本身就有序这种情况。此时内层循环只走一次,整体复杂度取决于外层循环,时间复杂度就是一层循环对应的 O(n)

  • 最坏时间复杂度:它对应的是数组完全逆序这种情况。此时内层循环每次都要移动有序序列里的所有元素,因此时间复杂度对应的就是两层循环的 O(n^2)

  • 平均时间复杂度:O(n^2)

function insertionSort(arr) {let len = arr.length;let temp ; //保存当前变量for(let i=1;i<len;i++){temp = arr[i];let j = i;//j来帮助temp找到自己的位置while(j>0 && temp < arr[j-1]){arr[j] = arr[j-1];j--;}arr[j] = temp;}console.log(arr);}

进阶排序算法

分治思想

分解子问题
求解子问题
合并子问题的解

归并排序

归并排序的时间复杂度就是 O(nlog(n))

  • 分解子问题:将需要被排序的数组从中间分割为两半,然后再将分割出来的每个子数组各分割为两半,重复以上操作,直到单个子数组只有一个元素为止。
  • 求解每个子问题:从粒度最小的子数组开始,两两合并、确保每次合并出来的数组都是有序的。(这里的“子问题”指的就是对每个子数组进行排序)。
  • 合并子问题的解,得出大问题的解:当数组被合并至原有的规模时,就得到了一个完全排序的数组
function mergeSort(arr) {const len = arr.length;if (len < 2) {return arr;}//计算分割点const middle = Math.floor(len / 2);//分割数组const leftArr = mergeSort(arr.slice(0, middle));const rightArr = mergeSort(arr.slice(middle, len));//合并两个有序数组return merge(leftArr, rightArr);}
//两个有序数组合并function merge(leftArr, rightArr) {let i = 0;let j = 0;//初始化结果数组const res = [];// 检查 leftArr 和 rightArr 是否为 undefinedconst len1 = leftArr? leftArr.length : 0;const len2 = rightArr? rightArr.length : 0;while (i < len1 && j < len2) {if (leftArr[i] < rightArr[j]) {res.push(leftArr[i]);i++;} else {res.push(rightArr[j]);j++;}}//将剩余的数组元素添加到结果数组中while (i < len1) {res.push(leftArr[i]);i++;}while (j < len2) {res.push(rightArr[j]);j++;}return res;}

快速排序

快速排序在基本思想上和归并排序是一致的,仍然坚持“分而治之”的原则不动摇。区别在于,快速排序并不会把真的数组分割开来再合并到一个新数组中去,而是直接在原有的数组内部进行排序。

快速排序会将原始的数组筛选成较小和较大的两个子数组,然后递归地排序两个子数组。

//快速排序 o(nlogn)function quickSort(arr,left=0,right=arr.length-1){//定义递归边界,若数组只有一个元素不用排序if(arr.length > 1){//下一次划分左右数组的索引位置const lineIndex = partition(arr,left,right);//对左子数组进行快排if(left<lineIndex-1){quickSort(arr,left,lineIndex-1);}//对右子数组进行快排if(lineIndex<right){quickSort(arr,lineIndex,right);}}return arr;}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/95391.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/95391.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/95391.shtml

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

相关文章

C#标签批量打印程序开发

C#标签批量打印程序开发&#xff08;集成Bartender解决方案&#xff09;一、系统架构设计 1. 核心模块划分 public class LabelPrintingSystem {private IDataLoader _dataLoader; // 数据加载器private ITemplateEngine _templateEngine; // 模板引擎private IPrintControl…

ECC的原理、背景、工作机制和数学基础

ECC的原理、背景、工作机制和数学基础摘要&#xff1a;本文首先详细介绍ECC&#xff08;Error-Correcting Code&#xff0c;纠错码&#xff09;的原理&#xff0c;包括背景、工作机制和数学基础。然后&#xff0c;解释ECC在SRAM&#xff08;Static Random-Access Memory&#x…

计算机网络2-2:物理层下面的传输媒体

目录 导引型传输媒体 同轴电缆 双绞线 光纤 电力线 非导引型传输媒体 无线电波 微波 红外线 可见光 无线电频谱管理机构 导引型传输媒体 同轴电缆 双绞线 光纤 光在光纤中传播的基本原理 电力线 非导引型传输媒体 无线电波 微波 红外线 可见光 LiFi(可见光通信) …

Dify 从入门到精通(第 32/100 篇):Dify 的日志分析与监控

Dify 从入门到精通&#xff08;第 32/100 篇&#xff09;&#xff1a;Dify 的日志分析与监控 Dify 入门到精通系列文章目录 第一篇《Dify 究竟是什么&#xff1f;真能开启低代码 AI 应用开发的未来&#xff1f;》介绍了 Dify 的定位与优势第二篇《Dify 的核心组件&#xff1a…

【IntelliJ IDEA】修改堆内存

idea卡顿&#xff0c;鼠标漂移修改idea文件打开 idea 安装路径&#xff0c;【bin】目录下【idea64.exe.vmoptions】文件修改【-Xms】最小内存【-Xmx】最大内存-Xms2048m -Xmx9216midea更改内存设置工具栏帮助更改内存设置设置堆大小上限为 文件 设置的最大内存保存并重启Leslie…

Docker与Docker Compose:容器世界的“单兵作战”与“军团指挥官”

在容器化技术的浪潮中&#xff0c;Docker和Docker Compose如同“双子星”&#xff0c;一个专注于单兵作战&#xff0c;一个擅长军团指挥。它们看似相似&#xff0c;却各司其职。对于开发者来说&#xff0c;理解它们的区别不仅能让代码部署事半功倍&#xff0c;更能避免踩坑。本…

进阶向:Python编写自动化邮件发送程序

Python编写自动化邮件发送程序&#xff1a;从零开始详解在数字化时代&#xff0c;自动化邮件发送功能已成为企业和个人提升工作效率的重要工具。据统计&#xff0c;全球每天发送的商业邮件超过30亿封&#xff0c;其中约40%是通过自动化系统发送的。这种功能被广泛应用于多种场景…

ChatGpt 5系列文章1——编码与智能体

人工智能技术正在以惊人的速度发展&#xff0c;重新定义着开发人员的工作方式。2025年8月&#xff0c;OpenAI正式发布了面向开发人员的GPT-5 一、GPT-5的编码能力突破 GPT-5在关键编码基准测试中创造了行业新纪录(SOTA)&#xff0c;在SWE-bench Verified测试中得分74.9%&…

力扣top100(day02-05)--二叉树 02

102. 二叉树的层序遍历 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left, TreeNode right)…

开疆智能Ethernet转ModbusTCP网关连接发那科机器人与三菱PLC配置案例

本案例是三菱FX5U PLC通过ethernet/IP转ModbusTCP网关对发那科机器人进行控制的配置案例。PLC端主要配置以太网端口设置在通信测试中&#xff0c;PLC作为主站&#xff0c;在PLC设置中选择“以太网端口”非常关键&#xff0c;以确保通信测试的正常进行。1、首先&#xff0c;在PL…

VUE+SPRINGBOOT从0-1打造前后端-前后台系统-系统首页

在现代Web应用开发中&#xff0c;管理后台是几乎所有企业级应用不可或缺的部分。一个优秀的后台首页不仅需要提供清晰的信息展示&#xff0c;还需要具备良好的用户体验和视觉效果。本文将详细介绍如何使用Vue.js框架配合Element UI组件库和ECharts图表库&#xff0c;构建一个功…

第6节 torch.nn介绍

6.1 torch.nn.Module介绍 torch.nn.Module是 PyTorch 中构建神经网络的基础类&#xff0c;所有的神经网络模块都应该继承这个类。它提供了一种便捷的方式来组织和管理网络中的各个组件&#xff0c;包括层、参数等&#xff0c;同时还内置了许多用于模型训练和推理的功能。 官网…

python自学笔记7 可视化初步

图像的组成工具库 Matplotlib&#xff1a;绘制静态图 Plotly: 可以绘制交互式图片 图像的绘制&#xff08;Matplotlib&#xff09; 创建图形&#xff0c;轴对象 创造等差数列 # 包含后端点 arr np.linspace(0, 1, num11) # 不包含后端点 arr_no_endpoint np.linspace(0, 1, n…

GIS 常用的矢量与栅格分析工具

矢量处理工具作用典型应用缓冲区分析Buffer环境影响区域&#xff0c;空间邻近度分析等&#xff0c;例如道路周围一公里内的学校&#xff0c;噪音污染影响的范围裁剪Clip例如使用A市图层裁剪全国道路数据&#xff0c;获取A市道路数据交集Intersect识别与LUCC、分区洪水区、基础设…

http与https协议区别;vue3本地连接https地址接口报500

文章目录问题解决方案一、问题原因分析二、解决方案详解1. 保持当前配置&#xff08;推荐临时方案&#xff09;2. 更安全的方案&#xff08;推荐&#xff09;3. 环境区分配置&#xff08;最佳实践&#xff09;三、为什么开发环境不用配置&#xff1f;问题 问题&#xff1a;本地…

C语言——深入理解指针(三)

C语言——深入理解指针&#xff08;三&#xff09; 1.回调函数是什么&#xff1f; 首先我们来回顾一下函数的直接调用&#xff1a;而回调函数就是通过函数指针调用的函数。我们将函数的指针&#xff08;地址&#xff09;作为参数传递给另一个函数&#xff0c;当这个指针被用来调…

kettle 8.2 ETL项目【四、加载数据】

一、dim_store表结构,数据来源于业务表,且随时间会有增加,属于缓慢变化维(SCD)类型二 转换步骤如下 详细步骤如下

【测试报告】SoundWave(Java+Selenium+Jmeter自动化测试)

一、项目背景 随着数字音乐内容的爆炸式增长&#xff0c;用户对于便捷、高效的音乐管理与播放需求日益增强。传统的本地音乐管理方式已无法满足多设备同步、在线分享与个性化推荐等现代需求。为此&#xff0c;我们设计并开发了一款基于Spring Boot框架的SoundWave&#xff0c;旨…

C++ 类和对象详解(1)

类和对象是 C 面向对象编程的核心概念&#xff0c;它们为代码提供了更好的封装性、可读性和可维护性。本文将从类的定义开始&#xff0c;逐步讲解访问限定符、类域、实例化、对象大小计算、this 指针等关键知识&#xff0c;并对比 C 语言与 C 在实现数据结构时的差异&#xff0…

奈飞工厂:算法优化实战

推荐系统的算法逻辑与优化技巧在流媒体行业的 “用户注意力争夺战” 中&#xff0c;推荐系统是决定成败的核心武器。对于拥有2.3 亿全球付费用户的奈飞&#xff08;Netflix&#xff09;而言&#xff0c;其推荐系统每天处理数十亿次用户交互&#xff0c;最终实现了一个惊人数据&…