java一次排序2个数组,无需额外空间
我应该如何优化我的代码
Given two sorted arrays
arr1[]
of sizeN
andarr2[]
of sizeM
. Each array is sorted in non-decreasing order. Merge the two arrays into one sorted array in non-decreasing order without using any extra space.Example 1:
Input:
N = 4, M = 5 arr1[] = {1, 3, 5, 7} arr2[] = {0, 2, 6, 8, 9}
Output:
0 1 2 3 5 6 7 8 9
Explanation: Since you can't use any extra space, modify the given arrays to form:
arr1[] = {0, 1, 2, 3} arr2[] = {5, 6, 7, 8, 9}
class Solution {
public void merge(int arr1[], int arr2[], int n, int m) {
for (int k = 0; k < n; k++) {
boolean c = false;
if (arr1[k] > arr2[0]) {
int temp = arr1[k];
arr1[k] = arr2[0];
arr2[0] = temp;
c = true;
}
if (c) {
int minIndex = 0;
for (int i = 0; i < m; i++) {
if (arr2[i] < arr2[minIndex])
minIndex = i;
}
int t = arr2[minIndex];
arr2[minIndex] = arr2[0];
arr2[0] = t;
}
}
for (int i = 0; i < m - 1; i++) {
int minIndex = i;
for (int j = i; j < m; j++) {
if (arr2[j] < arr2[minIndex]) {
minIndex = j;
}
}
int temp = arr2[i];
arr2[i] = arr2[minIndex];
arr2[minIndex] = temp;
}
}
}
# 1 楼答案
由于不能使用任何额外的空间,因此可以同时对这两个数组执行一种选择排序
n + m
,同时检查每个索引是否已在第二个数组中:另见:Java Selection Sort
# 2 楼答案
这是一个稍微简单的版本。它仍然具有相同的二次时间复杂度O(n*m),但执行速度比发布的代码快10倍,因此它确实符合优化版本:
不使用额外空间的合并是一个非常严格的约束:你认为局部变量是额外的空间吗?如果您考虑到有限的额外空间,例如128个元素的单个数组,则可以找到速度更快的解决方案,其执行速度比发布的中等大小数组(超过5000个元素)的代码快500到2000倍,但对于大型数组,仍然表现出二次时间复杂性
这是一个高级解决方案(对于500k单元阵列,速度快1000倍):
临时存储将以C或C++等语言分配给堆栈(自动存储),以达到最佳效率。p>
这是一个更有效的方法,在病理样本上的性能更好,在随机内容上的速度更快2.5倍:
减少临时存储大小几乎线性地降低了执行时间:
merge_chrlie2
仍然比使用12个元素的本地数组发布的代码快100倍,这很难被视为额外存储我在C中运行了一个基准测试,使用无空间合并函数作为经典的自顶向下递归合并排序的合并阶段。以下是包含128个元素的临时数组的计时(*):
以下是仅包含5个元素的临时数组的计时:
(*)以毫秒为单位的计时,分别为大于50k和200k的数组的
chqrlie
和shivam
外推