归并排序法排序数组(js版)

前端JS算法--归并排序 归并排序的时间复杂度是 O(n log n),这使得它在处理大型数据集时非常有效。然而,由于它需要额外的空间来存储合并后的数组,因此在空间复杂度上可能不如原地排序算法(如快速排序)高效。归并排序是一种分治算法,它将数组分成多个子数组,然后对这些子数组进行排序,最后将排序后的子数组合并成一个有序数组。整体思路如上图,需用递归实现,递归实现最重要的是写出递归公式、终止条件。:将数组分成两半,如果数组只有一个元素或为空,则不需要排序。:将排序后的两半合并成一个有序数组。:递归地对数组的两半进行归并排序。 阅读详情

归并排序

  • 归并排序是一种有效的排序算法,采用分治法(Divide and Conquer)策略来对数据进行排序。
  • 它将数组分成两半,递归地对每一半进行排序,然后将两个已排序的部分合并在一起。
  • 归并排序的时间复杂度为O(n log n),空间复杂度为O(n)。
  • 归并排序的基本思想是将一个数组分成两个子数组,分别对这两个子数组进行排序,然后将它们合并成一个有序的数组。

归并排序的实现过程如下:

  1. 将数组分成两半,直到每个子数组只有一个元素为止。
  2. 将两个已排序的子数组合并成一个有序的数组。
  3. 重复步骤1和步骤2,直到所有的子数组都被合并成一个有序的数组。


        function merge(left, right) {
                var result = [];
                while (left.length && right.length) {
                    if (left[0] <= right[0]) {
                        result.push(left.shift());
                    } else {
                        result.push(right.shift());
                    }
                }

                while (left.length)
                    result.push(left.shift());
                while (right.length)
                    result.push(right.shift());
                return result;
            }
        const mergeSort = array => {
            const len = array.length
            if (len < 2) {
                return array
            }

            const mid = Math.floor(len / 2)
            const first = array.slice(0, mid)
            const last = array.slice(mid)
            let left = mergeSort(first)
            let right = mergeSort(last)
            return merge(left,right)
        }
        const arr = [5,3,8,6,2,7,4,1]
        const sortedArr = mergeSort(arr)
        console.log('排序后的数组:', sortedArr)

执行顺序看下面:

mergeSort函数
  • 二分法分解数组,调用merge函数
  • 递归调用mergeSort函数,直到数组长度为1,然后调用merge函数
merge 函数
  • 有序的两个数组合并成一个有序的数组
  • 先比较两个数组的第一个元素,较小的放入新数组中,然后将指针向后移动一位,继续比较,直到有一个数组的元素全部放入新数组中
  • 执行顺序:合并小数组,再合并大数组,直到所有小数组都合并成一个大数组

执行顺序拆解 ⬇

从上往下执行:

mergeSort([5,3,8,6,2,7,4,1]){
	//省略步骤二分数组
    left = mergeSort([5,3,8,6]){
        left = mergeSort([5,3]){
            left = mergeSort([5]){
                return [5]
            }
            right = mergeSort([3]){
                return [3]
            }
            return merge([5],[3]) // [3,5]
        }
        right = mergeSort([8,6]){
            left = mergeSort([8]){
                return [8]
            }
            right = mergeSort([6]){
                return [6]
            }
            return merge([8],[6]) // [6,8]
        }
        return merge([3,5],[6,8]) // [3,5,6,8]
    }

    right = mergeSort([2,7,4,1]){
        left = mergeSort([2,7]){
            left = mergeSort([2]){
                return [2]
            }
            right = mergeSort([7]){
                return [7]
            }
            return merge([2],[7]) // [2,7]
        }
        right = mergeSort([4,1]){
            left = mergeSort([4]){
                return [4]
            }
            right = mergeSort([1]){
                return [1]
            }
            return merge([4],[1]) // [1,4]
        }
        return merge([2,7],[1,4]) // [1,2,4,7]
    }

    return merge(left, right) // [1,2,3,4,5,6,7,8]
}

总结: 归并排序通过递归拆分数组,再合并排序好的子数组,高效地实现了整体排序。

AD9371 官方例程构建及单音信号收发 项目构建基本流程和AD9361差不多,由于官方使用的ZCU102,记录下移植遇到的一些问题最终接收到正确的正弦波Errors: 0Errors: 0Errors: 0Errors: 0AD9361。 阅读详情

相关推荐

Dify视觉模型节点避坑指南:我用Qwen2.5-VL做OCR识别时踩过的3个坑(及解决方案)

本文分享了使用Dify平台和Qwen2.5-VL视觉模型进行OCR票据识别时遇到的三个常见问题及解决方案,包括文件变量传递、结构化输出和条件分支判断失效。通过实战经验,帮助开发者优化多模态模型在财务自动化中的应用,提升OCR识别精度和效率。

weixin_29284885的博客 403

JS实现归并排序(代码+讲解)

OK,最后还有三个排序了。 这一篇来说一下归并排序。 归并排序,顾名思义,就是把两个已经排好序的数组进行归并,成为一个新排序好的序列。 如图所示 假如我们有这样的两个已经排序好的序列 我们怎么能够把这两个序列合并成一个新的有序序列呢? 我们用两个变量i个j分别指向两个数组的第一个变量。 然后比较这两个变量的大小。 如果 arr【i】< arr【j】 : 那么就把arr【i】放在新数组里面,然后i向下移动一位。 然后再比较arr【i】和arr【j】的值,现在4比3大。 这样以此类推,总会有一个

weixin_46726346的博客 2370

告别ROS1思维:在ROS2 Humble上,用Python搞定MoveIt2机械臂控制的完整流程

本文详细介绍了在ROS2 Humble环境下使用Python控制MoveIt2机械臂的完整流程。从环境配置、架构变革到实战操作,涵盖URDF适配、Action接口编程及性能优化技巧,帮助开发者高效迁移ROS1项目至ROS2平台,实现工业级机械臂控制。

weixin_30352645的博客 449

JavaScript实现归并排序算法详解

归并排序(Merge Sort)算法,也叫合并排序,是创建在归并操作上的一种有效的排序算法。算法是采用分治法(Divide and Conquer)的一个非常典型的应用,且各层分治递归可以同时进行。归并排序思路简单,速度仅次于快速排序,为稳定排序算法,一般用于对总体无序,但是各子项相对有序的数列。归并排序和选择排序一样,归并排序的性能不受输入数据的影响,但表现比选择排序好的多,因为始终都是O(n log n)的时间复杂度。代价是需要额外的内存空间。

1668

ais信号接收设备_国内首款基于软件无线电技术的AIS基站投入测试使用

星网宇达子公司北京凯盾环宇科技有限公司经过多年的潜心研发,成功研制出国内首台基于软件无线电(SDR)的CATON 9011 AIS基站。该基站采用软件无线电技术,利用软件数字技术代替传统的模拟电路,大大的降低了模拟器件的使用率,提高了基站的可靠性和使用年限。CATON 9011 AIS基站研制依据ITU-R M.1371-5、IEC 62320-1、IEC 61162-1等国际标准,兼容...

weixin_29057163的博客 2334

Ansys CFX Pre 中 RGP 表的高级配置与优化策略

本文深入探讨了Ansys CFX Pre中RGP表的高级配置与优化策略,旨在帮助用户将仿真从“能用”提升至“精准好用”。文章重点解析了如何根据具体仿真场景,科学设定温度压力范围、选择流体类型,并针对相变等复杂工况实施网格加密与分离建表等关键优化技术,以显著提升计算精度与稳定性。

weixin_29216957的博客 1180

JS归并排序

一、基本思想 先将序列一次次分成子序列,直到子序列长度为1;再将已有序的子序列合并,得到完全有序的序列。运用了分而治之的思想(分治法)。 二、例子 输入数组 [ 2, 5, 3 , 10, -3, 1 , 6 , 4];初始状态如下: 分治思想如下:首先把数组依次折半,分成小的子数组,直到每一个子数组的长度都为1;然后合并子数组,在合并的过程中进行排序; 将数组分成子数组的方法比较简单,不过多介绍; 下面介绍一下合并操作,以最后一次合并为例: 下图是最后一次合并前的两个...

qq_48315043的博客 1077

3D 韩系风格漫剧人设 | GPT-Image2 人设生成【附完整提示词】

宁姚同款清冷剑系美人,极致小巧鹅蛋脸,下颌线紧致纤细流畅,下巴小巧精致收窄,小脸衬得五官格外舒展,韩式水光肌,面部精细水光高光,鼻梁高光、鼻尖高光、面中苹果肌高光、唇珠高光,红棕色长卷发偏分大波浪,垂在一侧肩前,发量蓬松。发量丰厚蓬松有体积感,不贴头皮,几缕碎发自然垂落脸侧修饰脸型,长度过胸及背,发丝柔顺丝滑卷度自然,发尾自然垂落,身穿香槟色缎面挂脖长裙,挂脖设计无袖露肩露背,上半身围裹式荡领胸口垂褶,腰部堆褶收腰,修身直筒包臀裙长度到脚踝,缎面光泽感强垂坠感好,极简剪裁。纯白色背景,3D漫剧写实厚涂风。

欢迎来到鸾姝淡月博客,专为程序员和编程爱好者打造的技术博客。我们分享编程语言趋势、开发工具、编程哲学、职业发展等,助你掌握新技术,优化技能,激发编程热情。 130

JavaScript实现归并排序算法并详解

归并排序是非常经典的基础排序之一,使用分治的思想,分而治之。 先将待排序数组分拆为更小的数组,一直拆分到只有一个元素(只有一个元素的数组就是有序的),然后对分拆的数组按顺序进行合并。这个思想就是分而治之的思想,变成实现的时候,常用递归编程技巧来实现。 直接上图来说这个过程(图是拷贝网上的): 这里重点详细讲一下合并过程,合并被分解好的左右两部分的时候,左右两部分分别已经排好了,因此可以按如下图策略合并:比如需要合并left [1,5,6]的数组和right [2,3,4]数组的过程图: ..

yangxinxiang84的专栏 1114

【推荐100个unity插件】皮毛shader着色器 实现可以用动的毛茸茸毛绒绒效果

Unity内置渲染管线毛发着色器实现 摘要:本文介绍了Unity内置渲染管线下的毛发着色器实现方案。该方案通过多层渲染技术模拟毛发效果,支持基础光照模型(环境光、漫反射和镜面反射),提供毛发长度调节功能。主要包含10个渲染通道,采用逐步增加的FURSTEP参数(0.05-0.55)分层渲染毛发,每层使用相同的着色器代码但不同参数值。该实现仅适用于内置渲染管线,不支持毛发动态效果,代码结构简洁,通过FurHelper.cginc包含核心着色逻辑。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 2676

国科大《人工智能原理与算法》2021年期末试题+2024经验(2025指南)

2021年期末试题+24年复习指南

MatsumotoChrikk 2926

js归并排序法

// merge 函数首先比较两个数组中第一个数的大小,并且返回较小的那个数组成一个新的数组, //然后在第一次比较中较大的那个数再进行第二次比较,比较的对象是第一次比较中较小的那个 //数组中的第二个数,第二次比较依旧返回两个数中较小的值,并且用数组API concat()把两个 //数组拼接起来,形成一个新的数组,然后进行第三次比较。 let merge = (arrayA, arrayB) => { if(arrayA.length === 0) return arrayB if...

weixin_44665635的博客 96

解决微信小程序长页面滚动到底部点击底部的输入框后输入框漂浮且页面滚动到顶部

一、问题描述 项目中有一个长页面上部展示部分信息下部为信息录入,页面长度为三屏幕(不同手机屏幕大小略有差异),当滚动到第二屏或者第三屏去填写信息时点击输入框后输入框漂浮起来了并且页面向上滚动了一段距离,回到了第一屏中展示的内容。效果如图。 滚动到第二屏,证件号输入。 点击输入框 可以看到证件号输入框漂浮了起来并且页面滚动到了第一屏展示的内容。 注意:小程序是2018年上线,在2020年4月份之前该页面从未出现过这种现象。推测:微信的后续更新中对微信小程序基础库进行了重构,导致点击输入框后页

仰望星空的代码 3259

javascript 冒泡排序法 插入排序法 选择排序法 归并排序法 堆排序法

sort var arr=new Array(); //产生十个随机数 for(var i=0;i<10;i++){ arr.push(parseInt(Math.random()*100)); } document.writeln(arr); /** * 冒泡排序法

冬天来了——的专栏 962

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

归并排序法

1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="utf-8"> 5 <meta name="viewport" content="width=device-width"> 6 <title>归并排序法</title&...

weixin_30782331的博客 71

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

冒泡排序法 插入排序法 选择排序法 归并排序法 堆排序法(javascript实现)

sort var arr=new Array(); //产生十个随机数 for(var i=0;i= 0; i--) { items = swap(items, 0, i); //将根和位置i的数据交换(用于将最大值放在最后面) items = moveDown(items, 0, i - 1); //数据交换后恢复堆的属性 }...

anole2012的博客 172

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

插入排序,选择排序,冒泡排序,归并排序,快速排序整理(js版本)

先上神图: 冒泡排序法:相邻比较大小,来决定是否交换位置,依次迭代,标准的冒泡排序内循环是在尾部开始的;稳定 插入排序法:打扑克牌整理牌时的做法,注意需要用到temp来缓存下一个值;稳定; 选择排序法:冒泡太着急了,我选择稳妥一点,一次迭代后才确定交换一次;不稳定;因为相同元素的位置会调换; 快速排序法:将一大堆数据分成两个堆,一个大的一个小的;然后分别在大堆小堆继续迭代,不稳定; ...

m0_38005587的博客 476

排序算法小小总结

今天琪琪子总结一下最近看的排序算法,对于一个非科班出身却偏想要成为冲浪少年的我来说,学习算法真滴是从头开始,一把辛酸泪。谈到排序我的小脑瓜里第一个想到的是.sort()函数,arr.sort((a,b)=>{a-b}),这显然是不够的,所以下面记录总结了经典的5种排序方法,包括原理与JS代码以及时间复杂度计算。

qq_41973183的博客 942

【js排序算法】--基础排序算法

前言 前端的代码运行环境本来就不善于处理大量的数据计算,前端也有很多东西比算法重要。那我们为什么要学习算法? 明确学习和使用算法的目的。 一个排序功能,用冒泡排序法,归并排序法,快速排序法?who tm care。一个原生sort函数直接搞定。这就是实用场景,快速实现你的功能即可。 那需不需要学习各种排序算法呢?需要,因为各种排序算法用了很多不用的手段,知识去实现同一个功能,学习里面的知识和优劣对比方法是很有用。 冒泡排序 先了解一下冒泡排序算法,它是最慢的排序算法之一,但也是最容易实现的排序算法。 之所以

houwhu的博客 413

javascript实现数据结构中的基本排序方法

简要介绍:基本排序方法,不外乎为冒泡法排序法,插入排序法,选择排序法,归并排序法和快速排序法。1.冒泡排序法 原理:比较任何相邻的项,如果第一个比第二个大,则交换它们,元素相步步上移,最大的元素依次沉底。//来一个冒泡排序 function bobbleSort(myArr){ var length=myArr.length; for(var i=0;i<length;i++){

liwusen的博客 442

JS排序算法(冒泡排序、选择排序、插入排序、快速排序、归并排序)

常见的排序算法

星河梦~的博客 1282

JavaScript实现归并排序算法

归并排序稍微复杂一丢丢,但是它的性能比前面的冒泡、选择和插入排序都好一点,是可以用在实战中的排序算法,听说以前火狐浏览器就是用它的 归并排序算法动图 一、归并排序的算法思路 为了说清楚,假如有10个数 1、先分组,大组分小组,再分小小组,直到分成一个数一组 左边是L,右边是R,每一个-表示后面的细分小组 (1)归并排序就是先对半劈,分成左边L1组5个和右边R2组5个两组 (2)左边5个分成左左边L1-L1组3个和右右边L1-R1组2个两组 (3)左左边的3个分成左左左边L1-L1-L1组的2个和右右右边L1

Yolanda_NuoNuo的专栏 390

算法 - 归并排序

归并排序采用的算法是分治法。分治法指的是分而治之,把大的问题分解成一个个小问题来解决。这里结合二分查找法来实现一个归并排序。

杏子 327

js中的归并排序

归并排序

李大头的博客 318

js 排序算法(4)- 归并排序

合并思路:定义一个辅助数组,和三个指针(一个指向辅助数组,一个指向数组1,一个指向数组2),进行比较赋值给辅助数组并进行指针移动。值得注意的是拷贝回去的时候是要从l左指针上开始拷贝。定义一个步长,对数组从左往右,逐次以步长进行分为左右数组进行合并。没有右边,跳过留给下一个循环合并。有右边,但是不够步长,直接合并。将数组一分为二,分别递归排序,在合并幅值回去。

m0_60613240的博客 137
上一篇: 新旧方法对比:JavaScript 中改变 `this` 指向的方式详解
下一篇: GitHub Copilot 三种模式详解:Ask、Agent、Edit
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值