归并排序 Merge Sort

news2024/10/2 14:25:47

在这里插入图片描述
归并排序的基本思想是什么?

采用分治法(Divide and Conquer),递归将待排序的数组平均分成两个子数组,直到子数组长度为 0 或 1,这是 Divider。再将排序好的两个子数组合并为一个有序数组,这是 Comquer


归并排序的 JavaScript 实现?

使用递归实现

function merge(left, right) {
    var result = [];
    let i = 0,
        j = 0,
        k = 0;
    while (i < left.length && j < right.length) {
        (left[i] <= right[j] && (result[k++] = left[i++]))
        ||(result[k++]=right[j++]);
    }
    while (i < left.length) {
        result[k++] = left[i++];
    }
    while (j < right.length) {
        result[k++] = right[j++];
    }
    return result;
}
function mergeSort(arr) {
    if (arr.length <= 1) {
        return arr;
    }
    // JavaScript 中除法运算会得到小数,因此使用 Math.floor 向下取整
    var middle = Math.floor(arr.length / 2);
    var left = arr.slice(0, middle);
    var right = arr.slice(middle);
    return merge(mergeSort(left), mergeSort(right));
}

使用迭代实现

function merge(arr, start, mid, end) {
    var result = [];
    let i = start,
        j = mid,
        k = 0;
    while (i < mid && j < end) {
        (arr[i] <= arr[j] && (result[k++] = arr[i++])) 
        || (result[k++] = arr[j++]);
    }
    while (i < mid) {
        result[k++] = arr[i++];
    }
    while (j < end) {
        result[k++] = arr[j++];
    }
    console.log(start, mid, end, result);
    for (let i = start; i < end; i++) {
        arr[i] = result[i - start];
    }
}
function mergeSort(arr) {
    for (let seg = 1; seg < arr.length; seg *= 2) {
        for (let start = 0; start < arr.length; start += seg * 2) {
            merge(arr,
                start,
                Math.min(start + seg, arr.length),
                Math.min(start + seg * 2, arr.length));
        }
    }
}
let arr = [5, 4, 3, 2, 1];
mergeSort(arr);
console.log(arr);

输出:

0 1 2 [ 4, 5 ]
2 3 4 [ 2, 3 ]
4 5 5 [ 1 ]
0 2 4 [ 2, 3, 4, 5 ]
4 5 5 [ 1 ]
0 4 5 [ 1, 2, 3, 4, 5 ]
[ 1, 2, 3, 4, 5 ]

就记住 mergeSort 函数的作用是 divide,将数组不停从中间分割,然后调用 merge 函数进行 conquer——归并。


归并排序的算法复杂度是?

归并排序的数组分解需要 O(logn) 次操作,而每一次分解都需要进行 O(n) 时间的合并,所以总的时间复杂度是 O(nlogn)。

归并操作需要 O(n) 的额外空间,如果使用递归的话还有栈空间消耗,为 O(logn)。总的空间复杂度还是 O(n)。


归并排序是否稳定?

稳定指的是原序列中两个相等的元素在排序后先后顺序不变。

稳不稳定看归并排序的归并操作:

while (i < left.length && j < right.length) {
	(left[i] <= right[j] && (result[k++] = left[i++]))
	||(result[k++]=right[j++]);
}
  1. left[i] <= right[j],result[k++] = left[i++]
  2. left[i] > right[j],result[k++]=right[j++]

遇到元素相等时,优先处理左边元素,这保证稳定性。

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

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

相关文章

AD学习笔记

1快捷键 A 各种对齐 L 切换顶层底层 右键联合 元器件的锁定 N 连线控制是否显示 2原理图和pcb交叉选择 封装重叠警告 在规则中修改

Tcp协议特点

目录 确认应答&#xff08;ACK&#xff09; 超时重传 建立连接-三次握手 断开连接-四次挥手 Tcp特点主要是分为四点&#xff1a;有连接&#xff0c;可靠传输&#xff0c;面向字节流&#xff0c;全双工。 这里我们主要介绍可靠传输 确认应答&#xff08;ACK&#xff09; …

EasyFalsh移植使用方法

参考&#xff1a;https://blog.csdn.net/Mculover666/article/details/105510837 注意&#xff1a; 这里说的修改默认环境变量后修改环境变量版本号就自动重新写入到flash这句话是有问题的&#xff0c;要开启上面【#define EF_ENV_AUTO_UODATE】宏定义后才会实现该功能&#…

Maven 必备技能:MAC 系统下 JDK和Maven 安装及环境变量配置详细讲解

开发中难免因系统问题或者版本变更反复折腾JDK和Maven环境变量&#xff0c;干脆写个笔记备忘个&#xff0c;也方便小伙伴们节省时间。 JDK安装与环境变量配置 1.官网下载jdk mac安装包: Java Downloads | Oracle " https://www.oracle.com/java/technologies/downloads…

携程网关的架构设计-日流量200亿

一、概述 类似于许多企业的做法&#xff0c;携程 API 网关是伴随着微服务架构一同引入的基础设施&#xff0c;其最初版本于 2014 年发布。随着服务化在公司内的迅速推进&#xff0c;网关逐步成为应用程序暴露在外网的标准解决方案。后续的“ALL IN 无线”、国际化、异地多活等…

【爬虫笔记】Python爬虫简单运用爬取代理IP

一、前言 近些年来&#xff0c;网络上的爬虫越来越多&#xff0c;很多网站都针对爬虫进行了限制&#xff0c;封禁了一些不规则的请求。为了实现正常的网络爬虫任务&#xff0c;爬虫常用代理IP来隐藏自己的真实IP&#xff0c;避免被服务器封禁。本文将介绍如何使用Python爬虫来…

day 1

使用cut截取出Ubuntu用户的家目录&#xff0c;要求&#xff1a;不能使用":"作为分割 grep ^ubuntu /etc/passwd|cut -d / -f 2,3 xmind

芒果app逆向分析 (二)

接着上文,我们发现请求后的结果是加密的状态,我们需要解密成明文看数据。 前面提到无法使用frida,直接上xposed. 直接就hook出来了?? key = "xkSHHy5DQzYwbZS32zJBDyrHCHWMDGDk" iv = "4yXhd2Ta4m6dif54"堆栈记录下,方便后续使用: 调用堆栈:at ja…

网络技术十七:IP路由原理

IP路由原理 引入 路由器负责将数据报文在逻辑网段间进行转发 路由是指导路由器如何进行数据报文发送的路径信息 每台路由器都有路由表&#xff0c;路由存储在路由表中 路由环路是由错误的路由导致的&#xff0c;它会造成IP报文在网络中循环转发&#xff0c;浪费网络带宽 路…

mac项目流程管理 OmniPlan Pro 4中文 for Mac

OmniPlan Pro 4是一款专业的项目管理软件&#xff0c;提供了强大的项目流程管理功能&#xff0c;帮助用户规划、执行和监控项目的各个阶段和任务。 以下是OmniPlan Pro 4中的项目流程管理功能&#xff1a; 1. 项目计划&#xff1a;用户可以使用OmniPlan Pro 4创建项目计划。软…

SAP MM学习笔记27- 购买依赖(采购申请)

前面已经努力的学习了 购买发注&#xff0c;入库&#xff0c;请求书照合 等功能&#xff0c;还是蛮多内容的哈。 剩下的功能&#xff0c;比如 右侧的 所要量决定&#xff0c;供给元决定&#xff0c;仕入先选择 还没学。 从这章开始&#xff0c;要开始学习它们了。 这一章先来…

【案例分享】H3C设备配置端口镜像

简介 本案例介绍本地端口镜像的配置方法。 组网需求 某公司内部各部门使用不同网段的IP地址&#xff0c;其中研发部使用10.1.1.0/24网段&#xff0c;市场部使用12.1.1.0/24网段。现要求通过配置本地端口镜像功能&#xff0c;使用数据监测设备对研发部和市场部访问Internet的流…

java对接webservice接口的四种方式

这两天一直在做外系统对接&#xff0c;对方的接口是webservice的形式&#xff0c;调用起来有些蛋疼&#xff0c;于是在这里记录一下我尝试过的调用WebService的三种方式。 方式一&#xff1a;以HttpURLConnection的方式调用 String url "http://127.0.0.1/cwbase/Service…

【LeetCode】297.二叉树的序列化与反序列化

题目 序列化是将一个数据结构或者对象转换为连续的比特位的操作&#xff0c;进而可以将转换后的数据存储在一个文件或者内存中&#xff0c;同时也可以通过网络传输到另一个计算机环境&#xff0c;采取相反方式重构得到原数据。 请设计一个算法来实现二叉树的序列化与反序列化…

百度智能云千帆大模型丨未来人手必备的代码助手

文章目录 1. 前言2. 千帆大模型平台3. 十分友好的功能4. comate代码助手5. 总结 1. 前言 我之前给大家推荐过Poe这个网站&#xff0c;它用的人比较少&#xff0c;但一旦接触后会发现它其实挺强大的。 因为它是一个可以同时支持好几个大模型的在线聚合平台。常用的GPT4&#x…

idea:java: Compilation failed: internal java compiler error

java: Compilation failed: internal java compiler error错误 检查下面2个即可&#xff1a;

智能转码技巧大揭秘,轻松实现视频转码!

你是否曾经遇到过需要将视频进行转码&#xff0c;但却被繁琐的步骤和复杂的参数困扰&#xff1f;现在&#xff0c;我们教你如何巧用智能转码&#xff0c;让视频转码变得轻松简单&#xff01; 首先第一步&#xff0c;我们要进入媒体梦工厂主页面&#xff0c;在板块栏里选择“智…

Debian11安装Geoserver+矢量插件Vector Tiles

呕心之作&#xff0c;小白教程 1 安装 Java 112 安装Geoserver2.1 安装2.2 设置自启动2.3 跨域问题 3 安装矢量插件 Geoserver的官网安装手册。 GeoServer需要 Java 8 或者 Java 11 环境 1 安装 Java 11 Debain默认安装 Java 11 版本&#xff0c;直接执行&#xff1a; # 确认…

保姆级别redis安装轻轻松松上手使用

Redis安装 Windows快速安装安装包下载安装 Windows快速安装 安装包下载 https://github.com/microsoftarchive/redis/tags安装 直接运行.msi的安装包&#xff0c;一直next&#xff0c;直到下面界面,勾选上再next 最后点击finish 进入计算机服务中(右键计算机–>管理–…

无涯教程-JavaScript - WORKDAY.INTL函数

描述 WORKDAY.INTL函数返回带有自定义周末参数的指定工作日数之前或之后的日期的序列号。周末参数指示哪些和多少天是周末。周末和指定为假期的任何日子均不视为工作日。 语法 WORKDAY.INTL (start_date, days, [weekend], [holidays])争论 Argument描述Required/OptionalS…