在不使用额外空间的情况下合并两个已排序数组2025年1月5日 | 阅读 5 分钟 在本教程中,我们将编写 Python 程序来合并两个已排序的数组,而无需使用额外的数组或空间。这个问题在技术面试中很常见。我们将使用各种技术来解决这个问题。让我们先理解问题陈述。 给定两个列表 arr1 和 arr2,它们都按升序排序。我们需要将它们合并成一个已排序的列表,而无需使用任何额外的存储空间。arr1 包含前 N 个元素,arr2 包含后 M 个元素。最终,arr1 和 arr2 都将是有序的。 让我们来理解解决方案。 方法 - 1:蛮力法(朴素方法)在朴素方法中,我们反复比较和交换两个数组中的元素,将它们合并成一个已排序的列表。以下是朴素方法的 Python 实现。 示例 - 输出 arr1 after merge: [1, 2, 3, 4] arr2 after merge: [6, 7, 8] 解释 - 上面的代码演示了一种朴素的方法,可以将两个已排序的数组 `arr1` 和 `arr2` 合并成一个已排序的数组,而无需使用任何额外的空间。以下是分步说明:
需要注意的是,这种朴素方法并不是合并已排序数组的最有效方法,尤其对于大型数组而言,因为它涉及对 arr2 的重复排序。还有其他更有效的算法可以在不使用额外空间的情况下合并两个已排序的数组,例如基于归并排序的方法,其时间复杂度为 O(n + m)。 最优方法 - 1此解决方案比蛮力方法更有效。让我们来理解下面的例子: 示例 - 输出 arr1 after merging: [0, 1, 2, 3] arr2 after merging: [5, 6, 7, 8, 9] 解释 - 在上面的代码中,我们初始化了两个指针,left 和 right,其中 left 指向 arr1 的最后一个索引,right 指向 arr2 的第一个索引。 当 left 大于或等于 0 且 right 小于 m(arr2 的长度)时,我们比较这两个指针处的元素。如果 arr1[left] 大于 arr2[right],我们交换这两个元素。否则,由于数组已排序,我们停止移动指针。 指针遍历完数组后,arr1 将包含较小的元素,arr2 将包含较大的元素。 最后,我们对 arr1 和 arr2 进行排序,以确保它们按升序排序。 时间复杂度: O(n * log(n) + m * log(m)) + O(n + m) 空间复杂度 - 0(1),因为我们没有使用额外的空间。 最优解决方案 - 2在此方法中,我们将使用基于希尔排序算法的 Gap 方法。这是一种有效地就地合并两个已排序数组的技术。这种方法通过减少比较和交换的次数来优化朴素方法。让我们来理解下面的例子。 示例 - 输出 arr1 after merging: [0, 1, 2, 3] arr2 after merging: [5, 6, 7, 8, 9] 解释 - 在上面的代码中 我们通过将两个数组的长度相加并除以 2 来计算初始步长。 我们使用一个 while 循环,只要步长大于 0,循环就会继续。此循环基于步长值控制排序和合并过程。 在循环的第一部分,我们对 arr1 进行希尔排序,然后比较并交换相距步长位置的元素,直到到达 arr1 的末尾。 在第二部分,我们合并 arr1 和 arr2 之间的元素,然后比较并交换步长距离内的元素,并相应地前进指针 i 和 j。 最后,如果 arr2 中还有剩余的元素需要排序(即,如果 j 小于 m),我们对 arr2 进行希尔排序。 我们在每次迭代中将步长减半,继续排序过程,直到步长变为 0。 此实现有效地合并了两个已排序的数组,而无需使用额外的空间,并且基于源自希尔排序的 Gap 方法。此方法的时间复杂度优于朴素方法。 结论在本教程中,我们学习了如何在不使用额外空间的情况下合并两个已排序的数组。我们探索了三种方法:涉及排序的朴素方法、使用指针的最优方法以及基于源自希尔排序的 Gap 技术的高效方法。最优和高效的方法最大限度地减少了不必要的交换和比较,使其更适合大型数组。通过遵循这些技术,您可以就地合并已排序的数组,使其成为技术面试和实际应用中的宝贵技能。 下一个主题名人问题 |
引言:在本教程中,我们正在学习关于 . OpenCV 是一个 Python 绑定库,旨在解决计算视觉问题。cv2.putText() 方法用于在每张图像上绘制一行文本。OpenCV putText() 是 OpenCV 中可用的命令...
5 分钟阅读
在下一个教程中,我们将学习如何使用 Python 编程语言检查给定的数字是否为霓虹数。但在我们开始之前,让我们先了解一下什么是霓虹数。什么是霓虹数?一个数字被称为...
阅读 4 分钟
简介:在本教程中,我们将学习 Python 中的 `tempfile` 模块。标准库中的 `tempfile` 模块定义了用于创建临时文件和目录的函数。它们是在操作系统文件系统定义的特殊临时目录中创建的。`tempfile` 是一个……
阅读 6 分钟
引言 在创新的 Web 开发领域,应用程序之间的互操作至关重要。Representational State Transfer (REST) API 已成为此类通信的主要媒介,HTTP 方法在此信息流中起着重要作用。在这些方法中,PUT 方法被证明是...
阅读 4 分钟
简介:在本教程中,我们将学习。Python Requests 是一个流行的库,用于在 Python 中发送 HTTP 请求。它提供了一种简单自然的方式来与网站和 API 交互。但是,与其他函数一样,处理... .
7 分钟阅读
? 开发人员可以使用 Python 字典高效地存储和操作数据,Python 字典是高度通用的数据结构。当涉及到将这些数据持久化到外部文件时,一个流行的选择是逗号分隔值 (CSV) 格式。在许多电子表格程序中,CSV 文件简单明了,广泛...
阅读 6 分钟
手语识别和 Python 入门 由于当前社会沟通依赖于声音传递信息,因此这已被作为优先事项。SLR 代表手语识别,是一个不断发展的领域,涉及...
阅读9分钟
引言:在本教程中,我们将学习如何在 Python 中查找列表的中位数。一组元素的**中位数**是将集合分成两部分的**值**,一部分的得分高于平均值,另一部分的得分低于平均值……
5 分钟阅读
假设你正在从文件或数组中读取数字,或者只是输入一个然后另一个,并且持续有数字流涌入。落在你目前看到的所有数字之间的那个数字...
阅读 15 分钟
编程中的一个关键思想是并发性,尤其是在可伸缩性和性能至关重要的当代软件开发中。在 Python 中,多个任务能够同时运行的能力可以提高程序效率,特别是对于涉及 CPU 或 I/O 密集型操作的活动。进程池是其中一种...
5 分钟阅读
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India