归并排序——有序序列的合并

目录

1、简述

2、复杂度

3、稳定性

4、例子


1、简述

有序序列的合并(Merge of Sorted Sequences)是归并排序的核心步骤之一。其目的是将两个已经排序的序列合并成一个新的有序序列。这个过程在归并排序中非常重要,因为归并排序通过递归地将序列分割成子序列,然后合并这些子序列来实现排序。

实现步骤

  1. 创建临时数组

    • 用于存储两个子序列的数据,以便合并操作。
  2. 双指针法

    • 使用两个指针分别指向两个子序列的开头。
    • 比较指针所指向的元素,将较小的元素放入临时数组中,然后移动指针。
  3. 处理剩余元素

    • 当一个子序列的元素全部被处理完后,将另一个子序列的剩余元素直接复制到临时数组中。
  4. 将临时数组的内容复制回原数组

    • 合并完成后,将临时数组中的数据复制回原数组对应的位置。

2、复杂度

  • 时间复杂度

    • O(n),其中 n 是两个有序序列的总长度,因为每个元素都只处理一次。
  • 空间复杂度

    • O(n),需要额外的空间来存储临时数组。

3、稳定性

有序序列的合并是稳定的,因为在合并过程中,相同元素的相对位置不会改变。

4、例子

#include <iostream>
#include <vector>// 合并两个有序子数组
void merge(std::vector<int>& arr, int left, int mid, int right) {int n1 = mid - left + 1;int n2 = right - mid;// 创建临时数组std::vector<int> L(n1);std::vector<int> R(n2);// 复制数据到临时数组 L[] 和 R[]for (int i = 0; i < n1; ++i)L[i] = arr[left + i];for (int i = 0; i < n2; ++i)R[i] = arr[mid + 1 + i];// 合并临时数组到原数组int i = 0, j = 0, k = left;while (i < n1 && j < n2) {if (L[i] <= R[j]) {arr[k] = L[i];++i;} else {arr[k] = R[j];++j;}++k;}// 复制剩余元素(如果有)while (i < n1) {arr[k] = L[i];++i;++k;}while (j < n2) {arr[k] = R[j];++j;++k;}
}// 测试代码
int main() {std::vector<int> array = {2, 5, 8, 1, 3, 7, 9, 10};int mid = (array.size() - 1) / 2;// 合并两个有序序列 [2, 5, 8] 和 [1, 3, 7, 9, 10]merge(array, 0, mid, array.size() - 1);std::cout << "Merged array is \n";for (int num : array)std::cout << num << " ";std::cout << std::endl;return 0;
}

代码说明

  1. merge 函数

    1. 参数arr 是待排序的数组,left 是左子数组的起始索引,mid 是左右子数组的分界点,right 是右子数组的结束索引。
    2. 步骤
      1. 创建并初始化两个临时数组 LR,分别存储左子数组和右子数组的元素。
      2. 使用双指针法将两个子数组合并到原数组中。
      3. 处理任何剩余的元素,将其直接复制到原数组中。
  2. main 函数

    1. 创建一个示例数组并设定中间点。
    2. 调用 merge 函数合并两个有序子数组。
    3. 输出合并后的数组。

 快捷跳转: 

  • 排序算法概述

生命不息,学习不止,若有不正确的地方,欢迎指正。

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

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

相关文章

技术职务管理助力智慧校园建设:深入解读人事系统

智慧校园人事系统中的技术职务管理模块&#xff0c;专注于高校及教育机构内技术人员及科研人员的职务管理&#xff0c;涵盖职称评审、技术职务任命、项目参与记录、科研成果跟踪及技术能力评估等多个方面&#xff0c;旨在通过信息化手段提升技术人才管理的效率与科学性。 在这一…

Windows如何安装并启动Nginx

0、前言 Nginx 是一款高性能、轻量级的Web服务器和反向代理服务器&#xff0c;广泛应用于互联网领域。它以其高效稳定、内存占用少和丰富的模块化设计而受到开发者们的青睐。 在实际使用过程中&#xff0c;我们多数时候会在Linux系统上运行Nginx&#xff0c;但实际上&#xff…

单目行车测距摄像系统(单目测距-行车)

单目行车测距摄像系统是一种利用单个摄像头实现车辆行驶中前方障碍物距离测量的技术。该系统通过计算机视觉算法&#xff0c;能够实时分析摄像头捕捉的图像&#xff0c;精确计算出车辆与前方物体之间的距离&#xff0c;对于自动驾驶、高级驾驶辅助系统&#xff08;ADAS&#xf…

PMP考试没通过别担心,补救办法来了

2024年6月PMP考试成绩正在陆续分批次发布。没有考试通过的同学就会疑问&#xff0c;考试没考过怎么办&#xff1f;可不可以补考&#xff1f;面对PMP考试没通过的情况&#xff0c;我们应该如何应对呢&#xff1f; 首先要告诉大家一个好消息&#xff01;6月考试不通过的考生可以…

24年hvv不要掉进秘网了,特别别被反制了

这两年的hvv&#xff0c;防守方已经不单单是每天坐那看监控、封ip了&#xff0c;越来越多的大佬投身防守工作中&#xff0c;让防守从被动变成了一个主动的活了。 目前最常见的主动防守有2种&#xff0c;1、长时间的蜜罐运营。2、蜜罐反制。 01-蜜罐运营 蜜罐这个词干安全的都…

七、函数练习

目录 1. 写一个函数可以判断一个数是不是素数。&#xff08;素数只能被1或其本身整除的数&#xff09; 2. 一个函数判断一年是不是闰年。 3.写一个函数&#xff0c;实现一个整形有序数组的二分查找。 4. 写一个函数&#xff0c;每调用一次这个函数&#xff0c;使得num每次增…

基于PHP花涧订购系统的设计与实现00332

摘 要 近年来&#xff0c;电子商务的快速发展引起了行业和学术界的高度关注。花涧订购系统旨在为用户提供一个简单、高效、便捷的花卉购物体验&#xff0c;它不仅要求用户清晰地查看所需信息&#xff0c;而且还要求界面设计精美&#xff0c;使得功能与页面完美融合&#xff0c;…

PIL,OpenCV,Pytorch处理图像时的通道顺序(颜色,长宽深)

项目颜色通道顺序长宽通道顺序数据类型取值范围PILRGBHWCndarray0-255 (byte)OpenCVBGRHWCndarray0-255 (byte)PyTorchRGB/BGR (取决于如何读取)(N)CHWtensor0-1 (float, 标准化后); 0-255 (int, 未标准化) 注意以下几点&#xff1a; 颜色通道顺序&#xff1a;PIL默认使用RGB顺…

图像增强方法汇总OpenCV+python实现【第二部分:高级图像增强方法】

图像增强方法汇总OpenCV+python实现【第二部分:高级图像增强方法】 前言高级图像增强方法1. 随机高斯模糊(Random Gaussian Blur)2. 随机灰度(Random Grayscale)3. 随机通道交换(Random Channel Swap)4. 随机伽马校正(Random Gamma Correction)5. 随机透视变换(Rando…

监控易在某市电子政务外网的运维应用案例

随着信息技术的飞速发展&#xff0c;电子政务已经成为政府提升服务效率、增强公众满意度的重要途径。某市电子政务外网作为该市政府部门与外界交互的主要平台&#xff0c;承载着大量关键业务与数据交互&#xff0c;其网络环境的复杂性、应用特点的多样性以及运维需求的挑战性&a…

AI程序员还是代替不了程序员,震撼硅谷的Devin-ai程序员,再度震撼硅谷——但这次是被打假

文章目录 主要疑点包括但不限于&#xff1a;35年从业者逐帧验证 AI程序员还是代替不了程序员&#xff0c;震撼硅谷的Devin-ai程序员&#xff0c;再度震撼硅谷——但这次是被打假 一位油管程序员博主Internet of Bugs对Devin发布的视频进行了逐帧分析&#xff0c;逐一举证说明了…

【C语言】register 关键字

在C语言中&#xff0c;register关键字用于提示编译器将变量尽量存储在CPU的寄存器中&#xff0c;而不是在内存中。这是为了提高访问速度&#xff0c;因为寄存器的访问速度比内存快得多。使用register关键字的变量通常是频繁使用的局部变量。 基本用法 void example() {regist…

猫头虎分享[可灵AI」官方推荐的驯服指南-V1.0

猫头虎分享[可灵AI」官方推荐的驯服指南-V1.0 猫头虎是谁&#xff1f; 大家好&#xff0c;我是 猫头虎&#xff0c;别名猫头虎博主&#xff0c;擅长的技术领域包括云原生、前端、后端、运维和AI。我的博客主要分享技术教程、bug解决思路、开发工具教程、前沿科技资讯、产品评…

Git 基础-创建版本库 git init、添加到暂存区git add、查看状态git status、查看改动git diff

目录 1.创建版本库 git init 1.创建版本库 git init 在目录中创建新的 Git 仓库。 你可以在任何时候、任何目录中这么做&#xff0c;完全是本地化的。 在目录中执行 git init&#xff0c;就可以创建一个 Git 仓库了。 注意: 没事不要手动修改 .git 目录里面的文件&#xff0c;不…

Nginx Http缓存的必要性!启发式缓存有什么弊端?

&#x1f440; Nginx Http缓存的必要性&#xff01;启发式缓存有什么弊端&#xff1f; 简介启发式缓存引发的问题nginx缓存配置 简介 我们在使用React或者Vue开发项目中会使用hash、chunkhash、contenthash来给静态资源文件进行命名。这带来的好处便是当我们部署完项目后&…

安卓微商大师V3.4.0/高级版一键群发僵尸粉检测

一款高效获取客源&#xff0c;备受好评的微商工具&#xff0c;资源丰富&#xff0c;秒速获得客源&#xff0c;大量群客源&#xff0c;都是散客&#xff0c;携手创业&#xff0c;是做微商生意的首选工具。打开即是黑钻高级会员 赶快体验吧 很强大 链接&#xff1a;https://pan.…

2023ICPC亚洲区域赛(合肥)VP补题题解(48th)

2023ICPC亚洲区域赛(合肥)VP补题题解记录 文章目录 2023ICPC亚洲区域赛(合肥)VP补题题解记录写在前面已更新 E F G J&#xff0c;待更新 B I C F and E(签到题和简单题)G. Streak Manipulation题目大意题目分析ac代码参考 J. Takeout Delivering题目大意题目分析ac代码参考 写在…

CSS-position/transform

1 需求 2 语法 在CSS中&#xff0c;positioning 和 transform 是两个非常重要的概念&#xff0c;它们分别用于控制元素在页面上的布局和变换。 Positioning CSS中的position属性用于设置元素的定位类型。它有几个值&#xff0c;包括&#xff1a; static&#xff1a;这是默认…

51单片机第12步_使用stdio.h库函数仿真串口通讯

本章介绍如何使用stdio.h库函数仿真串口通讯&#xff0c;学会使用view下面的“serial window #1”,实现模拟串口通讯。 Keil C51中有一些关键字&#xff0c;需要牢记&#xff1a; interrupt0:指定当前函数为外部中断0&#xff1b; interrupt1:指定当前函数为定时器0中断&…

MAC下的PDM工具

还在为MAC电脑下数据库设计发愁吗&#xff1f;从Windows切换到MAC&#xff0c;除了因为做苹果开发以外&#xff0c;更大的一个理由是不想被工具束缚&#xff0c;使用习惯不一样&#xff0c;不要紧。就像钱一样&#xff0c;当我们成为钱的习惯就成为钱的奴隶了。但是用MAC一年多…