JavaScript:数组排序(冒泡排序)

目录

一、数组排序

二、sort()方法

1、基本语法

2、默认排序

3、自定义排序

三、冒泡排序

1、基本概念

2、实现步骤

3、过程解析

4、代码示例

5、时间复杂度


一、数组排序

对一个给定数组进行处理,使其从无序变为有序,这个过程就是数组排序;

在JavaScript中可以通过多种方式实现数组排序;

比如,Array对象的sort()方法,冒泡排序等等;

二、sort()方法

在JavaScript中,sort()方法是数组对象的一个内置方法,用于对数组元素进行排序;

  • 它可以对数组的元素进行就地排序,在原数组上进行修改排序;
  • 返回排序后的数组,是对原数组的引用,不生成新的数组;
  • 排序顺序可以是字母或数字,可以按照升序或者降序排序;

1、基本语法

array.sort([compareFunction]);
  • array, 必须,要排序的数组;
  • compareFunction,可选,比较函数;默认将数组元素转换为字符串并按照字典顺序进行排序;

2、默认排序

不提供compareFunction 比较函数时,即采用默认排序;

当数组元素为数值型、字符串型等,会按照升序(默认)方式对该数组进行排序;

(1)数组元素为数值型

<script>// 1、默认排序// 1.1 数组元素为数值型let arrInt = [1,2,6,4,7,6,9,3,2,2,5,6]let newArrInt = arrInt.sort();console.log("原数组", arrInt);console.log("排序后的数组", newArrInt);console.log("原数组是否改变", arrInt !== newArrInt);
</script>

(2)数组元素为字符串型

<script>// 1、默认排序// 1.2 数组元素为字符串型let arrStr = ['q','qq','qqq','aaa','aa','a'];let newArrStr = arrStr.sort();console.log("原数组", arrStr);console.log("排序后的数组", newArrStr);console.log("原数组是否改变", arrStr !== newArrStr);
</script>

3、自定义排序

通过提供 compareFunction 比较函数,可以实现自定义排序,指定排序顺序;

比较函数:( a , b )=> { return a - b }

(1)数组元素为数值型

按照数字大小进行排序;

// 2、自定义排序// 2.1 数组元素为数值型
let arrInt = [1, 2, 6, 4, 7, 6, 9, 3, 2, 2, 5, 6]
// let newArrInt1 = arrInt.sort((a,b)=>{ return a - b});
// console.log("数字大小升序:", newArrInt1);
let newArrInt2 = arrInt.sort((a, b) => { return b - a });
console.log("数字大小降序:", newArrInt2);

(2)数组元素为字符串型

按照字符串长度进行排序;

// 2、自定义排序// 2.2 数组元素为字符串型
let arrStr = ['Apple', 'Strawberry','Orange','Grape', 'Cherry', 'Banana', 'Watermelon', 'Durian'];
// let newArrStr1 = arrStr.sort((a, b) => { return a.length - b.length });
// console.log("字符串长度升序:", newArrStr1);
let newArrStr2 = arrStr.sort((a, b) => { return b.length - a.length });
console.log("字符串长度降序:", newArrStr2);

(3)数组元素为对象

按照年龄大小排序;

// 2、自定义排序// 2.3 数组元素为对象
let arrObj = [{ name: "ZZ", age: 18 },{ name: "EE", age: 16 },{ name: "LL", age: 19 },{ name: "UU", age: 22 },{ name: "MM", age: 15 }
];
// let newArrObj1 = arrObj.sort((a, b) => { return a.age - b.age });
// console.log("年龄升序:", newArrObj1);
let newArrObj2 = arrObj.sort((a, b) => { return b.age - a.age });
console.log("年龄降序:", newArrObj2);

三、冒泡排序

1、基本概念

冒泡排序,是一种简单的排序算法,它通过重复遍历待排序的数列,比较相邻元素并交换它们的位置,直到整个数列有序;

这个过程就像气泡一样,让较大的元素逐渐“浮”到数组的顶端;

2、实现步骤

  • 从头到尾遍历整个数列,比较相邻的元素;
  • 如果前一个元素大于后一个元素,则交换它们的位置;
  • 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对;
  • 比较交换结束后,被比较的元素中最后一个就是相对最大的数;
  • 对整个数组元素重复上述过程(除了最后一个),每次需要交换的元素越来越少,直到没有需要交换的元素为止;

3、过程解析

以下的分析过程,均以该数组为例:arr = [4, 7, 2, 8, 8, 2, 4, 3, 4],共计9个元素进行升序排序;

(1)第一次排序

找出数组元素arr[0] arr[8]中的最大元素,将最大的元素放置在 arr[8] 的位置;

  • 第一步,比较arr[0] arr[1];如果arr[0] 大于 arr[1],则交换两个位置的元素(较大的元素后置);
  • 第二步,比较arr[1] arr[2];如果arr[1] 大于 arr[2],则交换两个位置的元素;
  • ......
  • 第八步,比较arr[7] arr[8];如果arr[7] 大于 arr[8],则交换两个位置的元素;

结束后,数组arr[0] arr[8]中最大的元素已经处在 arr[8] 的位置,此后,不再参与比较;

(2)第二次排序

找出数组元素arr[0] arr[7]中的最大元素,将最大的元素放置在 arr[7] 的位置;

  • 第一步,比较arr[0] arr[1];如果arr[0] 大于 arr[1],则交换两个位置的元素;
  • 第二步,比较arr[1] arr[2];如果arr[1] 大于 arr[2],则交换两个位置的元素;
  • ......
  • 第七步,比较arr[6] arr[7];如果arr[6] 大于 arr[7],则交换两个位置的元素;

结束后,数组arr[0] arr[7]中最大的元素已经处在 arr[7] 的位置,此后,不再参与比较;

(3)重复排序

根据第一次排序和第二次排序,重复这样的排序步骤,直到将arr[0]arr[1]做完比较排序,使得所有的元素有序;

(4)排序规律

  • 每一次排序都是在找,被比较的所有元素中最大的元素,并将其放置在这些元素的最后;
  • 数组中共有n个元素(长度为n),则排序的次数总计为n-1;
  • 第 i 次比较完成,就会有 i 个元素相对有序,参与下次比较的元素就只有 n-i 个;

4、代码示例

  • 函数定义:bubbleSort() 函数接收一个数组 arr 作为参数;
  • 参数校验:在排序之前,对传入的参数 arr 进行校验;
  • 外层循环:控制排序的轮数,总共需要 n - 1 轮( n 是数组长度);
  • 内层循环:进行相邻元素的比较和交换,随着外层循环的进行,已经排好序的元素会逐渐“浮”到数组的末尾,因此内层循环的范围逐渐减小;
  • 元素交换:如果当前元素大于下一个元素,则交换它们的位置;
  • 返回结果:排序完成后返回排序后的数组;
<script>// 传入正常数组console.log(bubbleSort([4, 7, 2, 8, 8, 2, 4, 3, 4]));// 传入空数组console.log(bubbleSort([]));// 传入非数组console.log(bubbleSort('arr'));// 冒泡排序function bubbleSort(arr) {// 判断传入的参数是否为数组if (Object.prototype.toString.call(arr) !== "[object Array]") return '不是数组';// 长度为0 或 1 的数组直接返回,不需要排序if (arr.length < 2) return arr;// 外层循环 控制比较的轮数for (let i = 0; i < arr.length-1; i++) {// 内层循环 控制相邻两个元素的比较和交换,for (let j = 0; j < arr.length - 1 - i; j++) {// 前一个元素大于后一个, 则交换这两个元素if (arr[j] > arr[j+1]) {let temp = arr[j+1];arr[j+1] = arr[j];arr[j] = temp}}}return arr;}
</script>

冒泡排序虽然简单易懂,但在处理大规模数据时效率较低(时间复杂度O(n²));

=========================================================================

每天进步一点点~!

记录一下冒泡排序这个有用的东东~~!

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

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

相关文章

二叉树基础及实现(二,加经典OJ)

目录&#xff1a; 一 .接引二叉树(一) 二 .二叉树相关oj题&#xff1a; 1. 检查两颗树是否相同 2. 另一颗树的子树 3. 翻转二叉树 4. 判断一颗二叉树是否是平衡二叉树 5. 对称二叉树 6. 二叉树的构建及遍历 7. 二叉树的分层遍历 8. 给定一个二叉树, 找到该树中两个指定节点的最…

Fine-BI学习笔记

官方学习文档&#xff1a;快速入门指南- FineBI帮助文档 FineBI帮助文档 (fanruan.com) 1.零基础入门 1.1 功能简介 完成四个流程&#xff1a;新建分析主题、添加数据、分析数据、分享协作。 示例数据获取&#xff1a;5分钟上手FineBI - FineBI帮助文档 (fanruan.com) 1.2 …

R语言优雅的进行广义可加模型泊松回归分析

泊松回归&#xff08;Poisson regression&#xff09;是以结局变量为计数结果时的一种回归分析。泊松回归在我们的生活中应用非常广泛&#xff0c;例如&#xff1a;1分钟内过马路人数&#xff0c;1天内火车站的旅客流动数&#xff0c;1天内的银行取钱人数&#xff0c;一周内的销…

【已解决】如何使用母版视图统一PPT格式?

母版视图在PPT中是一个强大的工具&#xff0c;可以帮助我们统一幻灯片的格式、布局和设计风格。今天来看看如何利用母版视图统一PPT格式&#xff0c;让每张幻灯片看起来一致和专业。 第一步&#xff1a;打开母版视图 打开PPT后&#xff0c;在顶部菜单栏中&#xff0c;选择【视…

Docker容器限制内存与CPU使用

文章目录 Docker 容器限制内存与 CPU 使用内存限额内存限制命令举例使用 `nginx` 镜像学习内存分配只指定 `-m` 参数的情况CPU 限制命令举例验证资源使用Docker 容器限制内存与 CPU 使用 在生产环境中,为了保证服务器不因某一个软件导致服务器资源耗尽,我们会限制软件的资源…

windows服务器启动apache失败,提示请通过cmd命令行启动:net start apache

Windows Server 2012 R2服务器突然停止运行apche&#xff0c;启动apache失败&#xff0c;提示请通过cmd命令行启动:net start apache 1.报错截图&#xff1a; 进入服务里输入命令启动也不行&#xff0c;提示由于登录失败而无法启动服务。 2.问题原因&#xff1a; 服务器www用…

Node.js知识点总结

Node.js知识点总结 Node.js其本质和浏览器一样是一个JavaScript运行环境。浏览器的运行环境为V8引擎浏览器内置API&#xff08;BOM、DOM、Canvas);而node.js的运行环境是V8引擎node提供的API(fs、path、http)。它使JavaScript可以编写后端。 基本知识 fs文件系统模块 它提供一…

springboot宠物相亲平台-计算机毕业设计源码16285

目 录 摘要 1 绪论 1.1 选题背景与意义 1.2国内外研究现状 1.3论文结构与章节安排 2 开发环境及相关技术介绍 2.1 MySQL数据库的介绍 2.2 B/S架构的介绍 2.3 Java语言 2.4 SpringBoot框架 3 宠物相亲平台系统分析 3.1 可行性分析 3.1.1 技术可行性分析 3.1.2 经济…

基于FPGA + Qt + OpenCv的人脸考勤系统

一:界面设计 客户端界面设计: 服务端界面设计: 简介:首先服务端在注册界面先注册人脸,然后客户端界面进行人脸识别,将人脸识别的图像发送给服务端以后,服务端在图像数据库里寻找人脸比对,若有数据就将查询到的个人信息发送给客户端,并在客户端显示,查询界面是用来查…

Ribbon负载均衡与内核原理

什么是Ribbon? 目前主流的负载方案分为两种&#xff1a; 集中式负载均衡&#xff0c;在消费者和服务提供方中间使用独立的代理方式进行负载&#xff0c;有硬件的&#xff08;比如F5&#xff09;&#xff0c;也有软件的&#xff08;Nginx&#xff09;客户端根据自己的请求做负…

开放式耳机哪种性价比高?五大高口碑优质款式耳机直入!

​或许我们的日常生活中充满了噪声&#xff0c;例如马路、地铁还有公交上&#xff0c;嘈杂的声音会影响我们的心情&#xff0c;同时还会损伤我们的耳朵&#xff0c;在嘈杂的环境中&#xff0c;想听歌想煲剧了怎么办&#xff0c;又不想沉浸在自己的世界里&#xff0c;就可以使用…

rk3588s 定制版 USB adb , USB2.0与USB3.0 区别,adb 由typeC 转换到USB3.0(第二部分)

硬件资源&#xff1a; rk3588s 核心板定制的地板 软件资源&#xff1a; 网盘上的 android12 源码 1 硬件上 客户只想使用 type c 接口中的 usb2.0 OTG 。在硬件上&#xff0c;甚至连 CC芯片都没有连接。 关于一些前置的知识。 1 USB2.0 与 USB3.0 的区别。 usb3.0 兼容2.0 …

【北京迅为】《i.MX8MM嵌入式Linux开发指南》-第三篇 嵌入式Linux驱动开发篇-第四十九章 平台总线总结回顾

i.MX8MM处理器采用了先进的14LPCFinFET工艺&#xff0c;提供更快的速度和更高的电源效率;四核Cortex-A53&#xff0c;单核Cortex-M4&#xff0c;多达五个内核 &#xff0c;主频高达1.8GHz&#xff0c;2G DDR4内存、8G EMMC存储。千兆工业级以太网、MIPI-DSI、USB HOST、WIFI/BT…

EEtrade:现货黄金盈利计算方法

现货黄金交易作为一种极具吸引力的投资方式&#xff0c;其盈利计算涉及多个关键因素&#xff0c;投资者需深入理解这些因素&#xff0c;才能准确评估交易结果&#xff0c;并制定科学的投资策略。 一、现货黄金基本盈利计算&#xff1a; 利润公式&#xff1a; 利润 (收盘价 -…

深入浅出mediasoup—WebRtcTransport

mediasoup 提供了多种 transport&#xff0c;包括 WebRtcTransport、PipeTransport、DirectTransport、PlainTransport 等&#xff0c;用来实现不同目的和场景的媒体通信。WebRtcTransport 是 mediasoup 实现与 WebRTC 客户端进行媒体通信的对象&#xff0c;是 mediasoup 最重要…

如何学习Airflow:糙快猛的大数据之路(附思维导图)

什么是Airflow? 在开始之前,让我们先简单了解一下Airflow是什么。Apache Airflow是一个开源的工作流管理平台。它允许你以代码的方式定义、调度和监控复杂的数据处理管道。 想象一下,你有一系列需要按特定顺序执行的任务,而且这些任务之间还有依赖关系,Airflow就是为解决这…

SpringBoot自动配置(面试重点)

自动配置是指&#xff1a; 自动配置是指在应用程序启动时&#xff0c;SpringBoot根据classpath路径下的jar包自动配置应用程序所需的一系列bean和组件&#xff0c;从而减少开发者的配置工作&#xff0c;提高开发效率。 一&#xff1a;Condition Condition是spring4.0之后添加…

linux离线安装mysql8(单机版)

文章目录 一、检查服务器是否有残留mysql资源&#xff0c;有的话就全删除1.1、查询mysql已安装的相关依赖&#xff1a;1.2、查找含有MySQL的目录 二、安装2.1、上传mysql安装包到文件夹下并解压2.2、移动及重命名2.3、mysql用户2.4、配置mysql所需的my.cnf文件2.5、给my.cnf配置…

JVM之经典垃圾回收器

1.垃圾回收器的分类 处理范围划分&#xff1a; 新生代垃圾回收器&#xff1a;serial、parNew、parallel scavenge&#xff1b; 老年代垃圾回收器&#xff1a;serial Old、parallel Old、CMS&#xff1b; 整堆收集器&#xff1a;G1、ZGC&#xff1b; 2.Serial GC Serial是单…

java单元测试:Mockito常用技巧

Mockito是Java中最流行的Mock框架之一&#xff0c;主要用于创建和配置模拟对象&#xff08;Mock&#xff09;&#xff0c;以测试代码的行为。Mockito使得单元测试更加简单和可控&#xff0c;特别是在需要隔离外部依赖的情况下。 1. Mockito简介 1.1 什么是Mockito Mockito是一个…