如何将两个排序数组合并为排序数组?这是我在一次面试中被问到的,这就是我提供的解决方案:public static int[] merge(int[] a, int[] b) {
int[] answer = new int[a.length + b.length];
int i = 0, j = 0, k = 0;
while (i < a.length && j < b.length)
{
if (a[i] < b[j])
{
answer[k] = a[i];
i++;
}
else
{
answer[k] = b[j];
j++;
}
k++;
}
while (i < a.length)
{
answer[k] = a[i];
i++;
k++;
}
while (j < b.length)
{
answer[k] = b[j];
j++;
k++;
}
return answer;}有更有效的方法吗?编辑:修正长度方法。
3 回答
Qyouu
TA贡献1786条经验 获得超11个赞
public static int[] merge(int[] a, int[] b) {
int[] answer = new int[a.length + b.length];
int i = a.length - 1, j = b.length - 1, k = answer.length;
while (k > 0)
answer[--k] =
(j < 0 || (i >= 0 && a[i] >= b[j])) ? a[i--] : b[j--];
return answer;}利益点
请注意,它所执行的操作数量与任何其他操作相同或更少。 O(N)
算法,但在字面上单语句在一个时间循环! 如果两个数组的大小大致相同,则O(N)的常数是相同的。但是,如果数组确实不平衡,则使用 System.arraycopy会赢,因为在内部,它可以使用单个x86程序集指令来完成这一任务。 通知 a[i] >= b[j]而不是 a[i] > b[j]..这保证了“稳定性”,即当a和b的元素相等时,我们希望a中的元素位于b之前。
森林海
TA贡献2011条经验 获得超2个赞
public static int[] merge(int[] a, int[] b) {
int[] answer = new int[a.length + b.length];
int i = 0, j = 0, k = 0;
while (i < a.length && j < b.length)
answer[k++] = a[i] < b[j] ? a[i++] : b[j++];
while (i < a.length)
answer[k++] = a[i++];
while (j < b.length)
answer[k++] = b[j++];
return answer;}添加回答
举报
0/150
提交
取消
