繁体   English   中英

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

[英]most efficient way to sort two sorted array into new sorted array

我正在尝试按升序将两个 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 循环的解决方案,但老实说,我不知道后两个 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++;
}       

这是带有注释的代码,解释了为什么需要最后两个循环。

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是原始数组的长度。 您可以通过用System.arraycopy替换最后的while循环来稍微提高性能。

合并两个大小为n排序数组的基本算法。 对于更通用的“分别合并两个大小为mn排序数组”,这应该足够了

//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++];
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM