排序之归并排序

        归并排序是第一个可以被实际使用的排序算法。归并排序性能不错,其复杂度为O(nlogn)。

        归并排序是一种分治算法。其思想是将原始数组切分成较小的数组,直到每个小数组只有一
个位置,接着将小数组归并成较大的数组,直到最后只有一个排序完毕的大数组。

var mergeSort = function(array) {
    array = mergeSortRec(array)
}

var mergeSortRec = function(array){
    var length = array.length
    if(length ===1 )  // {1}
    return array        // {2}

    var mid = Math.floor(length/2), // {3}
    left = array.slice(0,mid),      // {4}
    right = array.slice(mid,length) // {5}
    return merge(mergeSortRec(left),mergeSortRec(right))    // {6}
}

var merge = function(left,right){
    var result = [],    // {7}
    il=0,
    ir=0

    while(il<left.length && ir<right.length){   // {8}
        if(left[il]<right[ir]){
            result.push(left[il++])   //{9}
        }else{
            result.push(right[ir++])   // {10}
        }
    }

    while (il < left.length){ // {11}
        result.push(left[il++]);
    }

    while (ir < right.length){ // {12}
        result.push(right[ir++]);
    }

    return result     // {13}
}

        归并排序将一个大数组转化为多个小数组直到只有一个项。由于算法是递归的,我们需要一
个停止条件,在这里此条件是判断数组的长度是否为1(行{1})。如果是,则直接返回这个长度
为1的数组(行{2}),因为它已排序了。
        如果数组长度比1大,那么我们得将其分成小数组。为此,首先得找到数组的中间位(行{3}),找到后我们将数组分成两个小数组,分别叫作left(行{4})和right(行{5})。left数组由
索引0至中间索引的元素组成,而right数组由中间索引至原始数组最后一个位置的元素组成。
        merge函数(行{6}),它负责合并和排序小数组来产生大数组,直到回到原始数组并已排序完成。为了不断将原始数组分成小数组,我们得再次对left数组和right数组递归调mergeSortRec,并同时作为参数传递给merge函数。

        merge函数接受两个数组作为参数,并将它们归并至一个大数组。排序发生在归并过程中。
首先,需要声明归并过程要创建的新数组以及用来迭代两个数组(left和right数组)所需的两
个变量(行{7})。迭代两个数组的过程中(行{8}),我们比较来自left数组的项是否比来自right
数组的项小。如果是,将该项从left数组添加至归并结果数组,并递增迭代数组的控制变量(行
{9});否则,从right数组添加项并递增相应的迭代数组的控制变量(行{10})。
        接下来,将left数组或者right数组所有剩余的项添加到归并数组中(行{11}和行{12})。最后,将归并数组作为结果返回(行{13})。
        如果执行mergeSort函数,下图是具体的执行过程:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

获取Java类路径

利用System.getProperty(“java.class.path”)可以获取Java类路径&#xff08;Java class path&#xff09;。 package com.thb;import java.io.IOException;public class Test5 {public static void main(String[] args) throws IOException {System.out.println(System.getP…

pycharm在终端处删除连接过的服务器

目录 操作 操作 打开设置处的SSH配置进行删除

宝塔面板快速搭建本地网站结合内网穿透实现远程访问【无需公网IP】

文章目录 前言1. 环境安装2. 安装cpolar内网穿透3. 内网穿透4. 固定http地址5. 配置二级子域名6. 创建一个测试页面 前言 宝塔面板作为简单好用的服务器运维管理面板&#xff0c;它支持Linux/Windows系统&#xff0c;我们可用它来一键配置LAMP/LNMP环境、网站、数据库、FTP等&…

Python+Yolov8+onnx-deepsort方法物体人流量识别统计

程序示例精选 PythonYolov8onnx-deepsort方法物体人流量识别统计 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对《PythonYolov8onnx-deepsort方法物体人流量识别统计》编写代码&#xff0c;…

【采坑分享】npm login/publish/whoami失败采坑,解决npmERR426、ETIMEDOUT、ECONNREFUSED等错误

目录 前言背景&#xff1a; 采坑之路&#xff1a; 1.修改https为http&#xff0c;问题还在 2.修改为淘宝镜像&#xff0c;问题还在 3.修改为官网地址&#xff0c;问题还在 4.升级node和npm&#xff0c;问题还在 5.猜想网络问题&#xff0c;问题解决 采坑总结&#xff1a…

【EI会议征稿】第三届计算机、人工智能与控制工程国际学术会议

The 3rd International Conference on Computer, Artificial Intelligence and Control Engineering (CAICE 2024) 第三届计算机、人工智能与控制工程国际学术会议 第三届计算机、人工智能与控制工程国际学术会议&#xff08;CAICE 2024&#xff09;将于2024年1月26-28日在西…

批量解压imagenet1k数据集中的zip文件

导言&#xff1a; 最近在处理imagenet1k数据集时&#xff0c;面对大量的zip包&#xff0c;手动一个一个解压显然不是明智的选择。作为程序员&#xff0c;我们可以采用批量解压的方法来提高效率&#xff0c;下面就是解决这一问题的方法和原因分析。 问题背景&#xff1a; image…

软件测试用例经典方法 | 单元测试法案例

单元测试又称模块测试&#xff0c;是对软件设计的最小单元的功能、性能、接口和设计约束等的正确性进行检验&#xff0c;检查程序在语法、格式和逻辑上的错误&#xff0c;并验证程序是否符合规范&#xff0c;以发现单元内部可能存在的各种缺陷。 单元测试的对象是软件设计的最…

ESXI 6.7升级update3

一、适用场景 1、企业已有专业服务器&#xff0c;通过虚拟化环境搭建了vm server&#xff1b; 2、备份整个vm server时&#xff0c;需要使用ovftool工具完成&#xff0c;直接导出ovf模板时报错&#xff1b; 3、升级EXSI6.7的build 8169922版本为update 3版本后&#xff0c;已保…

无脑利用API实现文心一言AI对话功能?(附代码)

前言&#xff1a;在当今数字化的时代&#xff0c;人工智能&#xff08;AI&#xff09;技术正在不断演进&#xff0c;为开发者提供了丰富的工具和资源。其中&#xff0c;API&#xff08;应用程序接口&#xff09;成为构建强大AI应用的关键组成部分之一。本文将介绍如何利用API来…

P21 卷积神经网络CNN

卷积 参数共享 Maxpool 逐步限制 neuron的弹性&#xff0c; 感受野限制看的范围&#xff0c;参数共享限制参数 由于上述限制&#xff0c;CNN的bias 比较大&#xff0c;用在图像中&#xff0c;影响不大。 如果用在其他方面&#xff0c;要注意一下。 pooling的目的是降低计算…

如何在手机上设置每年农历日期的生日提醒?

生日是一个比较特殊的节日&#xff0c;很多人都会在生日的时候&#xff0c;被自己的亲朋好友送祝福和礼物&#xff0c;同理我们也要在亲朋好友生日的时候&#xff0c;为他们送上祝福和礼物&#xff0c;这时候如果忘记对方的生日就比较影响关系了。而有不少小伙伴都表示自己平时…

基于深度学习yolov5钢材瑕疵目标检测系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介简介YOLOv5钢材瑕疵目标检测系统特性1. 数据预处理2. 模型架构3. 训练策略4. 后处理 性能评估 二、功能三、系统四. 总结 一项目简介 # YOLOv5 钢材瑕疵目标…

数据结构-07-二叉树

前面学习的栈、队列等等都是线性表结构。树是一种非线性表结构&#xff0c;比线性表的数据结构要复杂。 1-树tree “树”这种数据结构类似我们现实生活中的“树”&#xff0c;这里面每个元素我们叫作“节点”&#xff1b;用来连线相邻节点之间的关系&#xff0c;我们叫作“父子…

js 实现图片上传

<style>.showFile{width: 200px;height: 200px;border: 1px solid blue;}.showFile img{width: 100px;height: 100px;} </style> <div><input type"file" id"file" multiple><!--展示所上传的文件--><div class"sho…

2023年【上海市安全员B证】考试题库及上海市安全员B证考试资料

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 上海市安全员B证考试题库是安全生产模拟考试一点通总题库中生成的一套上海市安全员B证考试资料&#xff0c;安全生产模拟考试一点通上上海市安全员B证作业手机同步练习。2023年【上海市安全员B证】考试题库及上海市安…

数字孪生项目的开发平台

WEBGL 开发数字孪生项目的流程涵盖了需求分析、场景搭建、模型创建、数据接入、动画与交互、性能优化、测试与部署以及维护与升级等方面。WEBGL 开发数字孪生项目的流程可以分为以下几个步骤&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外…

海外大文件传输好用的平台工具推荐

在当今全球化时代&#xff0c;跨国合作已经成为多个行业和领域的常态。创意人、广告从业者和创作者等经常需要与海外的合作伙伴或客户分享大型的视频、音频、图片等文件。这些文件通常具有较高的质量和分辨率&#xff0c;占用了大量的存储空间和网络带宽。因此&#xff0c;跨国…

设置一个vue文件的全局模板

VsCode在新建一个.vue文件的时候是空白的&#xff0c;需要我们自己输入片段&#xff0c;可这些在每次新建.vue文件都需要自己手敲&#xff0c;所以创建一个模板方便使用 设置vue模板 导入 {"生成 vue 模板": {"prefix": "vue","body"…

Linux查询指定时间点段日志Linux查询指定文件

Linux服务器高效查询日志查询文件 Ⅰ、常用几种日志查询语法Ⅱ、常用几种查询语法 Ⅰ、常用几种日志查询语法 #查询某日志前xx行日志 head -n 行数 日志文件名 #查询某日志后xx行日志 tail -n 行数 日志文件名 #查询固定时间点日志&#xff08;前提是这个时间点确实有日志输出…