将两个已排序数组排序为新排序数组的最有效方法

时间:2015-10-01 23:02:26

标签: java arrays performance sorting

我正在尝试按升序将两个int数组排序到一个新的int数组中。

我是这样编写的,除了textArr中的最后一个元素之外,它对所有内容进行了排序,我无法弄清楚为什么......

int i=0, j=0, k=0;
while(i < textArr.length && j < binaryArr.length) {
    if(textArr[i] < binaryArr[j]) {
        mergeArr[k] = textArr[i];
        i++;
    }
    else {
        mergeArr[k] = binaryArr[j];
        j++;
    }
    k++;
}

我环顾四周,找到了一个解决方案,添加了两个新的while循环,但老实说我不知道​​那些后两个循环正在做什么。我还想知道这是否是将两个数组排序成第三个排序数组的最有效方法?感谢您的帮助,我对java很新,并且想要正确学习并且显然我想要了解我实际上也在写什么!

int i=0, j=0, k=0;
while(i < textArr.length && j < binaryArr.length) {
    if(textArr[i] < binaryArr[j]) {
        mergeArr[k] = textArr[i];
        i++;
    }
    else {
        mergeArr[k] = binaryArr[j];
        j++;
    }
    k++;
}
while(i < textArr.length) {
    mergeArr[k] = textArr[i];
    i++;
    k++;
}       

2 个答案:

答案 0 :(得分:1)

这是您的代码,其中包含注释,解释了为什么需要最后两个循环。

int[] textArr = {1, 2, 3, 3, 9};
int[] binaryArr = {4, 5, 6};
int[] mergeArr = new int[textArr.length + binaryArr.length];

int i=0, j=0, k=0;
while(i < textArr.length && j < binaryArr.length) {
    if(textArr[i] < binaryArr[j]) {
        mergeArr[k] = textArr[i];
        i++;
    }
    else {
        mergeArr[k] = binaryArr[j];
        j++;
    }
    k++;
}
// At this point either i == textArr.length or j == binaryArr.length
// so you cannot do textArr[i] < binaryArr[j] without getting
// an ArrayIndexOutOfBoundsException. 
// However the algorithm isn't finished. You still need to transfer
// the remaining numbers from one of the original arrays into the answer.
while(i < textArr.length) {
    mergeArr[k] = textArr[i];
    i++;
    k++;
}
while(j < binaryArr.length) {   // It said i in question. I corrected.
    mergeArr[k] = binaryArr[j];
    k++;
    j++;
}

System.out.println(Arrays.toString(mergeArr));

至于这是否是最有效的代码。它就像你能得到的一样好。任何算法都必须读取所有数字,因此您不能比O(n + m)做得更好,其中nm是原始数组的长度。您可以使用while替换最终的System.arraycopy循环来略微提高性能。

答案 1 :(得分:0)

用于合并两个大小为n的排序数组的基本算法。对于更通用的&#34;合并两个分别大小为mn的排序数组&#34;

,这应该足够了。
//given arrays A, B, create C
var i, j = 0, k = 0;
for (i = 0; i < 2n; i++) {
  if (A[j] < B[k]) { 
    C[i] = A[j++]; 
  }
  else { 
    C[i] = B[k++];
  }
}