C++程序 合并两个已排序的数组
给定两个已排序的数组,任务是以已排序的方式合并它们。
示例:
输入 : arr1[] = {1, 3, 4, 5},arr2[] = {2, 4, 6, 8}
输出 : arr3[] = {1, 2, 3, 4, 4, 5, 6, 8}
输入 : arr1[] = {5, 8, 9},arr2[] = {4, 7, 8}
输出 : arr3[] = {4, 5, 7, 8, 8, 9}
Naive Approach:
这是一种粗暴的方法来完成同样的操作。将arr1和arr2的所有元素放入arr3中,然后简单地对arr3进行排序。
以上方法的实现如下:
输出:
时间复杂度: O((m+n) log(m+n)) ,arr3的整个大小为m+n
辅助空间: O(1) ,没有使用额外的空间
方法2(O(n1 * n2)时间和O(n1+n2)额外空间)
- 创建一个大小为n1 + n2的数组arr3[]。
- 将arr1[]的所有n1个元素复制到arr3[]中
- 遍历arr2[]并一次将arr3[]的元素插入到arr1[]中(类似于插入排序)。这一步需要O(n1 * n2)的时间。
我们在 合并两个已排序的数组并使用O(1)额外空间的文章中讨论了上述方法的实现 。
方法3(O(n1 + n2)时间和O(n1 + n2)额外空间)
使用归并排序的Merge函数的想法。
- 创建一个大小为n1 + n2的数组arr3[]。
- 同时遍历arr1[]和arr2[]。
- 选择arr1[]和arr2[]中当前元素中较小的一个,将该较小的元素复制到arr3[]的下一个位置,并在arr3[]和所选数组中向前移动。
- 如果arr1[]或arr2[]中还有剩余元素,则也将它们复制到arr3[]中。
下面的图片是以上方法的运行结果:
下面是以上方法的实现:
输出
输出:
时间复杂度: O(n1 + n2)
空间复杂度: O(n1 + n2)
方法四:使用映射(O(nlog(n) + mlog(m)) 时间和 O(N) 额外空间)
- 将两个数组的元素作为键插入映射中。
- 打印映射的键。
以下是上述方法的实现。
输出
时间复杂度: O( nlog(n) + mlog(m) )
空间复杂度: O(N)