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

news2024/12/23 18:13:57

目录

一、数组排序

二、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.coloradmin.cn/o/1945604.html

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

相关文章

Python文件打包exe文件

作者的一点话 你是否还在为py文件无法像其他可视化项目展示出来&#xff0c;制造图形界面的移动使用&#xff0c;那接下来我会与你一同使用它&#xff0c;并进行study&#xff0c;如有困惑&#xff0c;可随时联系。 然后&#xff0c;需要使用pysimplgui&#xff0c;如果…

Vue3+.NET6前后端分离式管理后台实战(三十一)

1&#xff0c;Vue3.NET6前后端分离式管理后台实战(三十一)

数据开发/数仓工程师上手指南(一)数仓概念总览

前言 笔者毕业最开始从事的就是大数据开发和数据仓库建设工作&#xff0c;途中曾担任过人工智能工程师和计算机视觉工程师&#xff0c;没想到最后兜兜转转还是回到了最原本的工作数据开发工程师。但很少有写关于本职工作的技术内容输出。 之前笔者撰文内容大部分都是关于算法…

Spring Boot集成screw实现数据库文档生成

1.什么是screw&#xff1f; 在企业级开发中、我们经常会有编写数据库表结构文档的时间付出&#xff0c;从业以来&#xff0c;待过几家企业&#xff0c;关于数据库表结构文档状态&#xff1a;要么没有、要么有、但都是手写、后期运维开发&#xff0c;需要手动进行维护到文档中&…

Postman接口测试工具的使用

一、postman简介 Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件。作用&#xff1a;常用于进行接口测试。不需要安装。 特征&#xff1a;简单&#xff0c;实用&#xff0c;美观&#xff0c;大方。 二、Postman接口测试工具的使用 Postman不需要安…

qt 自定义样式 switch开关,已解决

在日常需求中&#xff0c;需要对功能增加一个开关&#xff0c;因此做了简单封装。结果能正常使用。自定义信号接收&#xff01; 实现 QWidget* switchBtn new CCendSwitchWidget(btn_value);connect(switchBtn, SIGNAL(clicked(bool,QString)), this, SLOT(clickedSlot(bool,…

【吊打面试官系列-ZooKeeper面试题】Zookeeper 的典型应用场景

​大家好&#xff0c;我是锋哥。今天分享关于 【Zookeeper 的典型应用场景 】面试题&#xff0c;希望对大家有帮助&#xff1b; Zookeeper 的典型应用场景 Zookeeper 是一个典型的发布/订阅模式的分布式数据管理与协调框架&#xff0c;开发人员可以使用它来进行分布式数据的发布…

Zabbix监控应用

目录 一.监控tomcat 二.Zabbix监控TCP 三.zabbix监控nginx 四.snmp监控 五.监控web 六.聚合图形 一.监控tomcat 1.在tomcat服务器上安装zabbix-agent服务 [rootnode2 etc]#vim zabbix_agentd.conf 94 Server192.168.240.13 #指向当前zabbix server ##### Passive chec…

Web 性能入门指南-3.5 优化单页应用程序 (SPA)

&#x1f338; 欢迎来到前端后花园&#xff01;这里是一个温馨的小角落&#xff0c;专为热爱前端技术的你打造。没有华丽的辞藻&#xff0c;只有真诚的分享。希望你能在这里找到实用的内容&#xff0c;学到新知识&#xff0c;同时也欢迎你畅所欲言&#xff0c;分享你的思考和见…

【Linux学习 | 第1篇】Linux介绍+安装

文章目录 Linux1. Linux简介1.1 不同操作系统1.2 Linux系统版本 2. Linux安装2.1 安装方式2.2 网卡设置2.3 安装SSH连接工具2.4 Linux和Windows目录结构对比 Linux 1. Linux简介 1.1 不同操作系统 桌面操作系统 Windows (用户数量最多)MacOS ( 操作体验好&#xff0c;办公人…

jenkins替换配置文件

1.点击首页的【Manage Jenkins】-【Manage Plugins】&#xff0c;在选项【Available plugins】安装 Config File Provider Plugin &#xff0c;安装后重启jenkins 2.安装完成后会有这个图标&#xff0c;点进去 3.点击新建&#xff0c;选择自定义&#xff0c;填入要替换的文件…

C语言 | Leetcode C语言题解之第268题丢失的数字

题目&#xff1a; 题解&#xff1a; /* 求和运算 */ /* 对[0,n]求和, 减去数组每个元素, 得出丢失的元素 */ int missingNumber(int* nums, int numsSize){int i;int sum numsSize;for (i 0; i < numsSize; i) {sum i - nums[i];}return…

【Spring】SpringRetry重试机制和Spring异步任务发送操作结合应用场景实操,通俗易懂

平时调用一些第三方接口或者内部接口&#xff0c;可能出现处理异常或者超时或者意外因素&#xff0c;我们可以使用重试机制来为用户提高体验。 1.引用依赖 <dependency><groupId>org.springframework.retry</groupId><artifactId>spring-retry</a…

【单片机毕业设计选题24079】-基于单片机的室内通风系统

系统功能: 系统分为手动和自动模式&#xff0c;上电默认为自动模式&#xff0c;自动模式下系统根据采集到的传感器值 自动控制&#xff0c;温度过低后自动开启加热&#xff0c;湿度过低后自动开启继电器加湿&#xff0c;获取到烟雾值大于设定值或获取到的CO值大于设定的CO值时…

视图,存储过程和触发器

目录 视图 创建视图&#xff1a; 视图的使用 查看库中所有的视图 删除视图 视图的作用&#xff1a; 存储过程&#xff1a; 为什么使用存储过程&#xff1f; 什么是存储过程&#xff1f; 存储过程的创建 创建一个最简单的存储过程 使用存储过程 删除存储过程 带参的存储…

【已解决 Python】 TypeError: can only concatenate list (not “int”) to list

【已解决 Python】 TypeError: can only concatenate list (not “int”) to list 在Python编程中&#xff0c;TypeError: can only concatenate list (not "int") to list是一个常见的错误。此错误表明你尝试将一个整数&#xff08;int&#xff09;与列表&#xff…

初识redis:通用命令

今天我们简单介绍一些关于redis的基础命令。 目录 get 和 set 全局命令 keys EXISTS del&#xff08;delete&#xff09; expire TTL Redis的key过期策略是怎么实现的&#xff1f; type get 和 set 连接到云服务器后&#xff0c;通过redis-cli命令进入到redis客户端…

7月21日读Neuroimage Denoiser

Neuroimage Denoiser for removing noise from transient 1 fluorescent signals in functional imaging. Summary Neuroimage Denoiser&#xff0c;这是一种新型的基于U-Net的模型&#xff0c;可以有效去除显微镜记录中瞬时局部荧光信号的噪声。该模型使去噪过程与记录频率和…

sql注入 mysql 执行命令 sql注入以及解决的办法

我们以前很可能听过一个词语叫做SQL注入攻击&#xff0c;其是威胁我们系统安全的最危险的因素之一&#xff0c;那么到底什么是SQL注入攻击呢&#xff1f;这里我会用一个最经典最简单的例子来跟大家解释一下&#xff1a; 众所周知&#xff0c;我们的sql语句都是有逻辑的&#xf…

Python爬虫:代理ip电商数据实战

引言&#xff1a;数据访问管理引发的烦恼 作为一名Python博主&#xff0c;爬虫技能对于获取和分析数据至关重要&#xff0c;经常爬一下&#xff0c;有益身心健康嘛。爬虫技术对很多人来说&#xff0c;不仅仅是一种工具&#xff0c;更像是一种艺术&#xff0c;帮助我们从互联网…