JavaScript——数组的应用内排序

news2024/11/24 3:54:01

目录

任务描述

相关知识

冒泡排序

一趟冒泡排序

冒泡排序全过程

选择排序

一趟选择排序

选择排序全过程

编程要求

任务描述

本关任务:掌握冒泡排序和选择排序。

相关知识

所谓排序是指将一组数据按照从小到大(或从大到小)的顺序重新排列,排序是面试常考的问题之一。

排序一般分为两个步骤:比较和移动。比较指判断两个数据之间的大小关系,移动指根据大小关系把数据移动到合适的位置上。

待排序的数据大多是放置在数组中,一是因为数组中的数据有相对的顺序,二是遍历数组操作起来比较简单。

下面介绍 JavaScript 中两种常见的排序方式:冒泡排序和选择排序。

冒泡排序

一趟冒泡排序

先介绍一趟冒泡排序的过程。

以升序为例,从第一个元素开始,将第一个元素与第二个元素比较,如果第一个元素大于第二个元素,交换这两者。

如图1所示,9比5大,交换两者的位置后,9就到后面去了。

图1

然后第二个元素与第三个元素比较,将大的移动到后面;第三个元素与第四个元素比较......,这样一直进行下去,直到倒数第二个元素和最后一个元素进行比较,称为一趟冒泡排序,结束后最大的元素已经移到了索引最大处。图2展示了每一次比较并交换后的数组:

图2

可以看到,一趟冒泡排序结束后,最大的元素`9`移到了索引最大处。

冒泡排序全过程

接下来对除了最后一个元素的数组进行第二趟冒泡排序,结果是第二大的元素到了索引第二大的地方。这样一直进行下去,直到整个数组有序或者某一趟排序的时候不存在元素的交换。如图3

图3

第四趟冒泡过程中,未发生元素的交换,结束。

因为排序的原理是不断的把大的数据往上浮动,故而命名为冒泡排序。

// 冒牌排序
var arr = [9,5,8,0,2,6];
var aLength = arr.length;
var temp;
var flag = 0;    // 元素交换的标志位
for(var i = 1;i < aLength;i++) {    // 共进行n-1次冒泡
    flag = 0;
    for(var j = 0;j < aLength-i;j++) {    // 一次冒泡
        if(arr[j]>arr[j+1]) {    // 交换元素
            temp = arr[j];
            arr[j] = arr[j+1];
            arr[j+1] = temp;
            flag = 1;
        }
    }
    if(flag == 0) break;    //    本次冒泡没有元素交换
}
console.log(arr);

冒泡排序关键在于这两个循环的控制,外层循环控制冒泡的次数,一般是n-1次,n表示数组长度。

内循环j的初值为0,因为不论是第几趟冒泡,都是从arr[0]开始遍历数组,j的上限设置为arr.length-i,因为随着冒泡的进行,越往后需要比较的数组的索引上限越小。

选择排序

一趟选择排序

原理:遍历数组,记录下最大元素的索引值,将最大的元素与数组最后一个元素交换,这样最大的元素到了索引值最大的地方,称为一趟选择排序。与冒泡不同的是,只会发生一次交换。如图4

图4

可以看到9移到了索引最大处。

选择排序全过程

第二趟选择排序是在除了最后一个元素的数组中选择最大的元素,将它与索引值第二大的元素交换,结束后第二大的元素也到了最终的位置上。这样一直进行下去,一共n-1趟选择排序。如图5

图5

// 选择排序
var arr = [6,12,3,34,1,56,77,0,2,43];
var aLength = arr.length;
var temp;
var max = arr[0];
var maxIndex = 0;
for(var i = 0;i < aLength-1;i++) {    // 共进行n-1次选择
    for(var j = 1;j < aLength-i;j++) {    // 一次选择
        if(arr[j] > max) {
            max = arr[j];
            maxIndex = j;
        }
    }
    // 将本次选出的最大元素移动到最终的位置上
    temp = arr[aLength-i-1];
    arr[aLength-i-1] = arr[maxIndex];
    arr[maxIndex] = temp;
    var max = arr[0];
    var maxIndex = 0;
}
console.log(arr);

这里也有两个大循环,第一个循环控制总的排序趟数,第二个循环求本次选择出的最大元素的索引值,第二个循环结束后将本次的最大值与最终位置上的元素交换。

编程要求

本关的编程任务是补全右侧代码片段中 Begin 至 End 中间的代码,具体要求如下:

  • 函数mainJs(a)中的变量arr是一个数组,你需要对该数组进行选择排序;

  • 返回选择排序进行过程中,在每一趟交换前,待排序子数组的最大元素的位置组成的数组;

  • 比如对于上面相关知识中的数组[9,5,8,0,2,6],第一次交换前,最大的元素9的索引是0,第二次交换前,最大元素8的索引是2,第三次交换前最大元素6的索引是0,第四次交换前最大元素5的索引是1,第五次交换前最大元素2的索引是1,第六次交换前最大元素0的索引是0。索引需要返回的数组是[0,2,0,1,1,0]

    function mainJs(a) {
        var arr = a.split(",");
        for(var i = 0;i < arr.length;i++) {
            arr[i] = parseInt(arr[i]);
        }
        //请在此处编写代码
        /*********begin*********/
        var length = arr.length;
        var max = arr[0];
        var t = 0;
        var maxindex = 0;
        var newArr = new Array();
        for (var i = 0; i < length - 1; i++){
            for (var j = 1; j < length - i; j++){
                if (arr[j] > max) {
                    max = arr[j];
                    maxindex = j;
                }
            }
            newArr.push(maxindex);
            t = arr[length - i - 1];
            arr[length - i - 1] = arr[maxindex];
            arr[maxindex] = t;
            var max = arr[0];
            var maxindex = 0;
        }
        return newArr;
        /*********end*********/
    }

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

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

相关文章

windows USB 驱动开发-URB结构

通用串行总线 (USB) 客户端驱动程序无法直接与其设备通信。 相反&#xff0c;客户端驱动程序会创建请求并将其提交到 USB 驱动程序堆栈进行处理。 在每个请求中&#xff0c;客户端驱动程序提供一个可变长度的数据结构&#xff0c;称为 USB 请求块 (URB) &#xff0c;URB 结构描…

C# 验证PDF数字签名的有效性

数字签名作为PDF文档中的重要安全机制&#xff0c;不仅能够验证文件的来源&#xff0c;还能确保文件内容在传输过程中未被篡改。然而&#xff0c;如何正确验证PDF文件的数字签名&#xff0c;是确保文件完整性和可信度的关键。本文将详细介绍如何使用免费.NET控件通过C#验证PDF签…

【TS】TypeScript 入门指南:强大的JavaScript超集

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 TypeScript 入门指南&#xff1a;强大的JavaScript超集一、TypeScript 简介1.1 …

【ARM系列】1 of N SPI

1 of N模式 SPI 概述配置流程 概述 GIC-600AE支持1 of N模式SPI。在此模式下可以将SPI target到多个core&#xff0c;并且GIC-600AE可以选择哪些内核接收SPI。 GIC-600AE只向处于powered up 并且使能中断组的core发送SPI。 GIC-600AE会优先考虑那些被认为是active的核&#xf…

零成本、高收益!我是怎么通过Stable Diffusion做副业的,AI绘画助你轻松开启副业!

通过Stable Diffusion赚钱的方法 人工智能&#xff08;AI&#xff09;已经在创意领域取得了重大进展。特别是Stable Diffusion为各行各业提供了创新解决方案。从播客标志到生日蛋糕设计&#xff0c;由AI生成的艺术呈现了个人和企业的无限可能性。以下是您可以通过Stable Diffu…

利用MATLAB绘制傅里叶变换后的图形

题目如下&#xff0c;其中周期是 2 π 2\pi 2π y { 1 0 < x < π 0 x 0 − 1 − π < x < 0 y\begin{cases} 1 \ 0<x<\pi\\ 0 \ x0\\ -1 \ -\pi <x<0\\ \end{cases} y⎩ ⎨ ⎧​1 0<x<π0 x0−1 −π<x<0​ 计算可得 a n 1 π ∫ −…

linux中的进程以及进程管理

程序和进程的区别和联系 程序&#xff08;Program&#xff09;&#xff1a; 程序是一组指令的集合&#xff0c;通常存储在磁盘或其他存储设备上&#xff0c;是一种静态的概念。程序本身并没有运行&#xff0c;它只是一个可执行的文件或脚本&#xff0c;包含了一系列的指令和数…

气象监测仪:现代气象观测的利器与未来展望

在科技日新月异的今天&#xff0c;气象监测仪作为气象观测的重要工具&#xff0c;以其独特的功能优势&#xff0c;为气象预报、灾害预警以及科学研究等领域提供了强有力的支持。本文将从气象监测仪的功能优势出发&#xff0c;探讨其在现代气象观测中的应用及未来发展。 一、气象…

如何实现公网环境远程连接本地局域网宝塔FTP服务远程管理文件

文章目录 前言1. Linux安装Cpolar2. 创建FTP公网地址3. 宝塔FTP服务设置4. FTP服务远程连接小结 5. 固定FTP公网地址6. 固定FTP地址连接 &#x1f4a1;推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。…

汇编语言程序设计-6-中断及其应用

6. 中断及其应用 文章目录 6. 中断及其应用6.0 阶段导学6.1 移位指令-shl/shr/sal/sar/rol/ror/rcl/rcr6.2 操作显存数据6.3 描述内存单元的标号6.4 数据的直接定址表6.5 代码的直接定址表6.6 中断及其处理6.7 编制中断处理程序6.8 单步中断6.9 由int指令引发的中断-int6.10 BI…

嵌入式Linux系统编程 — 6.1 信号的基本概念

目录 1 信号的概念和作用 1.1 什么是信号 1.2 信号的目的 1.3 信号如何处理 2 信号的分类 2.1 可靠信号与不可靠信号 2.2 实时信号与非实时信号 3 常见信号与默认行为 3.1 信号本质上是 int 类型数字编号 3.2 常见信号 1 信号的概念和作用 1.1 什么是信号 信号是一…

为什么要学习大模型应用开发?原因80%的人都不知道

0 prompt engineer 就是prompt工程师它的底层透视。 1 学习大模型的重要性 底层逻辑 人工智能大潮已来&#xff0c;不加入就可能被淘汰。就好像现在职场里谁不会用PPT和excel一样&#xff0c;基本上你见不到。你问任何一个人问他会不会用PPT&#xff0c;他都会说会用&#x…

Python安装,几个步骤轻松实现(超详细)

目录 步骤一、进入官网 步骤二、将鼠标放在Downloads上&#xff0c;选择All releases 步骤三、 下滑找到Looking for a specific release&#xff0c;选择python版本点击Download安装 步骤四、下滑找到Files&#xff0c;以windows64为例&#xff0c;点击下载 步骤五、安装Py…

RTL8305NB从电口模式切换为光口模式

#if 1//下面是参考案例 //RTL8305NB#define PORT2_PHY_ADDR 0x05 // SFP Port2 PHY地址 #define STATUS_REG_ADDR 0x01 // 状态寄存器地址#define MDC_PIN GPIO_Pin_13 //MDC (PC13) #define MDIO_PIN GPIO_Pin_6 //MDIO (PE6)#define MDIO_DELAY 10 // us #defin…

秋招Java后端开发冲刺——基础篇5(String集合)

一、String String类是Java中字符串操作类&#xff0c;位于java.lang包下String类型对象的底层使用字符数组char[]存储字符串&#xff0c;由final修饰且没有提供公共的修改方法&#xff0c;因此String对象是不可变的。常见方法 方法名作用trim()去掉字符串首尾空字符split(分…

[AI Perplexica] AI驱动的开源搜索引擎

之前&#xff0c;我们有介绍过 Perplexcity 现在&#xff0c;开源市场上&#xff0c;也有一款对标产品 Perplexica &#xff0c;我们来看下 界面很像 介绍 Perplexica是一个开源的、由AI驱动的搜索工具或搜索引擎&#xff0c;它深入互联网寻找答案。受到Perplexity AI的启发…

警惕!帕金森老人身体恶化七大征兆,家有老人必看!

帕金森病&#xff0c;这个在老年人群中越来越常见的神经系统疾病&#xff0c;以其独特的“静止性震颤、运动迟缓、肌强直和姿势平衡障碍”等四大症状&#xff0c;成为许多家庭心中的痛。然而&#xff0c;帕金森病的进展并非一蹴而就&#xff0c;而是有着一系列的身体变坏征兆。…

vue3源码(六)渲染原理-runtime-dom

1、从入口文件看实现 项目入口文件 import { createApp } from vue import ./style.css import App from ./App.vuecreateApp(App).mount(#app)文件位置core\packages\runtime-dom\src\index.ts 保证了render的唯一性 // // rendererOptions 是patchProp 和nodeOps的合集&a…

材料科学SCI期刊,IF=6+,超高录用率,2个月录用

一、期刊名称 Advanced Electronic Materials 二、期刊简介概况 期刊类型&#xff1a;SCI 学科领域&#xff1a;材料科学 影响因子&#xff1a;5.3 中科院分区&#xff1a;2区 三、期刊简介 Advanced Electronic Materials 是一个跨学科论坛&#xff0c;旨在为材料科学、…

YOLOv8-对注意力机制模型进行通道剪枝-同时实现涨点和轻量化【附代码】

文章目录 前言视频效果文章概述必要环境一、训练自己的模型1、 训练命令2、 训练参数解析 二、模型剪枝1、 对训练好的模型将进行剪枝2、 剪枝代码详解1.解析命令行参数2. 定义剪枝函数3. 定义剪枝结构4. 更新注意力机制5. 保存更新后的模型6. 主函数 三、剪枝后的训练运行命令…