合并两个排序的数组

发布时间:2026/9/15 1:07:37

合并两个排序的数组 面试题 10.01. 合并排序的数组 - 力扣LeetCode方法一直接合并后排序最先想到的一种方法也是最基础、最直接的方法就是将B中的数据追加到A数组中然后排序。如下代码首先将B中的数据追加到A的后边然后使用堆排序进行排序。时间复杂度O((mn)log(mn))空间复杂度O(1)直接在数组A上进行排序没有使用新的空间。class Solution { public: void merge(vectorint A, int m, vectorint B, int n) { for (int i 0; i n; i) { A[mi] B[i]; } heapSort(A, mn); } void heapSort(vectorint data, int size) { makeInitialHeap(data, size); for (int i 0; i size; i) { int tmp data[0]; data[0] data[size - 1 - i]; data[size - 1 - i] tmp; adjustHeap(data, 0, size - 1 - i - 1); } } void makeInitialHeap(vectorint data, int size) { int mid size / 2; for (int i mid; i 0; i--) { adjustHeap(data, i, size - 1); } } //调整堆使用递归算法 //调整堆是堆排序的核心算法 void adjustHeap(vectorint data, int startIndex, int endIndex) { if (startIndex endIndex) { return; } int leftChildIndex startIndex * 2 1; int rightChildIndex startIndex * 2 2; int biggerIndex startIndex; if (leftChildIndex endIndex data[leftChildIndex] data[biggerIndex]) { biggerIndex leftChildIndex; } if (rightChildIndex endIndex data[rightChildIndex] data[biggerIndex]) { biggerIndex rightChildIndex; } if (biggerIndex ! startIndex) { int tmp data[startIndex]; data[startIndex] data[biggerIndex]; data[biggerIndex] tmp; adjustHeap(data, biggerIndex, endIndex); } } };方法二双指针利用A和B已是排序链表的前提使用双指针进行排序。时间复杂度O(mn)空间复杂度O(mn)。class Solution { public: void merge(vectorint A, int m, vectorint B, int n) { vectorint tmp(mn); int index 0; int i 0; int j 0; while (i m j n) { if(A[i] B[j]) { tmp[index] A[i]; index; i; } else { tmp[index] B[j]; index; j; } } while (i m) { tmp[index] A[i]; index; i; } while (j n) { tmp[index] B[j]; index; j; } for (int k 0; k m n; k) { A[k] tmp[k]; } } };双指针的思想在一些题目中也会被用到①回文字符串需要使用双指针两个指针从两边向中间进行字符对比②环形链表使用快慢指针快慢指针也属于双指针③在快速排序中首先要选定一个值然后要确定这个值在数组中的位置也需要从左和从右向中间进行比较也会用到双指针方法三从后向前方法二中使用了一个临时数组先将数据放到临时数组中排序完成之后再将数据放回数组A中。之所以使用临时数组是因为如果直接将数据放到数组A中可能会出现数据被覆盖的情况。为了避免数据被覆盖的情况可以使用一个临时数组还可以使用从后向前的方法。class Solution { public: void merge(vectorint A, int m, vectorint B, int n) { int i m - 1; int j n - 1; int index m n - 1; while (i 0 j 0) { if (A[i] B[j]) { A[index] A[i]; index--; i--; } else { A[index] B[j]; index--; j--; } } while(j 0) { A[index] B[j]; index--; j--; } } };从前向后是我们默认的最自然的一种方式。有时候从前向后不是最优解需要使用从后向前的方式。内存移动的实现也用到了从后向前的方法。数据的长度是n从源地址src移动到目的地址dst有以下4种情况1src和dst没有重合src在dst前边。可以从前向后移动也可以从后向前移动。2src和dst有重合src在dst前边。从前向后移动会出现覆盖的情况只能从后向前移动。3src和dst有重合src在dst后边。可以从前向后移动从后向前移动会出现覆盖的情况。4src和dst没有重合src在dst后边。可以从前向后移动也可以从后向前移动。可以使用if else来实现共4个分支。4个判断分支还可以优化4种分类情况可以分为两类主要是情况2和情况3两类情况1和情况2可以属于其中的一类。如下代码将2和1划分到了同一类3和4划分到了同一类。void *memmove(void *dst,const void *src,int n) { char *dp (char *)dst; char *sp (char *)src; if (sp dp){ for (int i 0; i n; i) { *(dp n - 1 - i) *(sp n - 1 - i); } } else { for (int i 0; i n; i) { *(dp i) *(sp i) } } } return dst; }
延伸阅读

更多相关文章

2026/9/15 1:06:35

面向不平稳工业时序数据的预测(持续学习)

如有侵权或其他问题,欢迎留言联系更正或删除。 出处:IEEE TRANSACTIONS ON INDUSTRIAL INFORMATICS 2024(CCF C期刊、中科院一区)一 提出动机1. 挑战:工业数据动态变化,导致:数据分布漂移 (da…

2026/9/15 1:06:20

专科生必备:8款实测有效的降AI检测率工具推荐

1. 项目概述作为一名专科院校的学生,在学术写作和日常作业中,降低AI检测率(即让内容看起来更像人工创作)已经成为一项必备技能。随着AI写作工具的普及,教育机构对AI生成内容的检测也越来越严格。本文将分享8款经过实测…

2026/9/15 1:06:20

PHP投资理财网站源码解析与安全部署指南

简介:这是一套基于PHP开发的完整投资理财网站源码,面向Web开发初学者、PHP进阶学习者及需要快速搭建金融类Web项目的开发者,可助力理解用户认证、账户管理、投资交易等核心业务逻辑的实现方案。资源共1999个文件,涵盖515个PHP后端…

2026/9/15 1:06:20

数字化办公时代的高效工具选择与实践指南

1. 效率工具的价值与选择逻辑在数字化办公时代,效率工具早已从"锦上添花"变成了"生存必需品"。我经历过从纸质记事本到Notion的知识管理进化,也见证过团队从邮件沟通到Slack协作的转型过程。真正高效的工具有个共同特点:…

2026/9/15 1:01:20

8款AI论文工具实测:从选题到文献综述全流程优化

1. 为什么你需要这些AI论文工具?作为一名带过上百篇毕业论文的导师,我见过太多学生在文献检索阶段浪费大量时间。去年有个学生为了找一篇关键文献,花了整整两周泡在图书馆,最后发现需要的参考文献其实就在某个学术数据库里躺着。这…

2026/9/14 2:17:50

拯救者Y7000黑屏故障排查与维修实战指南

1. 项目概述:一台黑屏的拯救者Y7000,到底卡在哪一步? 联想拯救者Y7000系列笔记本,从2018年第一代搭载i5-8300H开始,到后来的i7-9750H、i7-10750H、i5-11400H,再到2023年款的R7-7840HS,它始终是学…

2026/9/15 0:01:16

AI英语单词APP开发:自适应学习算法与移动端优化实践

1. 项目概述 作为一名在移动应用开发领域摸爬滚打多年的老手,我最近完成了一个AI英语单词APP的开发项目。这个项目将传统单词记忆方法与现代AI技术相结合,打造了一款能够智能适应不同用户学习习惯的英语学习工具。 市面上大多数单词APP都存在一个通病&a…

2026/9/15 0:01:16

Flutter与OpenHarmony结合开发手语学习APP实战

1. 项目背景与核心价值作为一名同时接触过Flutter和OpenHarmony的开发者,最近我完成了一个基于Flutter for OpenHarmony的手语学习APP实战项目。这个项目最大的特点在于实现了跨平台框架与国产操作系统深度结合的创新实践——用Flutter开发的应用能完美运行在OpenHa…

2026/9/15 0:01:16

六个月成为机器人工程师:从ROS2到SLAM的实战路径

1. 六个月的紧迫感从哪来:先搞清楚你要成为哪种机器人工程师说实话,六个月的期限并不是一个宽松的时间线。市面上任何一本正经的机器人学教材都超过五百页,ROS2的官方文档可以翻到你怀疑人生,再加上ABB、KUKA这些工业机器人厂家动…

2026/9/14 11:59:31

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/14 13:53:59

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/14 11:22:57

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码