Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将两个排序数组排序为新排序数组的最有效方法_Java_Arrays_Performance_Sorting - Fatal编程技术网

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

Java 将两个排序数组排序为新排序数组的最有效方法,java,arrays,performance,sorting,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++; }

我试图将两个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++;
}
inti=0,j=0,k=0;
while(i
我环顾四周,找到了一个解决方案,添加了两个新的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++;
}       
inti=0,j=0,k=0;
while(i
合并大小为
n
的两个排序数组的基本算法。对于更通用的“合并大小分别为
m
n
的两个排序数组”来说,这应该足够了

//给定数组A、B、C
变量i,j=0,k=0;
对于(i=0;i<2n;i++){
如果(A[j]
这是您的代码,并附有注释,解释为什么需要最后两个循环

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));
int[]textArr={1,2,3,3,9};
int[]二进制arr={4,5,6};
int[]mergeArr=newint[textArr.length+binaryArr.length];
int i=0,j=0,k=0;
while(i

至于这是否是最有效的代码。这差不多是你能得到的最好的了。任何算法都必须读取所有的数字,因此你不能比
O(n+m)
做得更好,其中
n
m
是原始数组的长度。通过将最后的
while
循环替换为
系统,您可以稍微提高性能。arraycopy

它被称为合并。我明白了,只是不知道最后两个while循环到底在做什么。查看发生了什么的最好方法是使用调试器逐步完成算法。我现在知道了基于什么你说下面保罗,谢谢你!如果你把你的答案写在一个答案里,我会把它删掉。老实说,我不明白调试器是如何工作的。我通常会在线访问Java Visualizer,甚至没有想到这一点。我还想看看这是否也是最好的方法。另外,如果你有时间,我在下面的评论中有一个超级快速的问题。这将抛出一个
ArrayIndexOutOfBoundsException
。为了避免这种情况,您可以使用类似问题中的方法。那么,在我上面代码的第二部分中,两个额外的while循环究竟在做什么呢?我相信你是对的,保罗,我写了一些非常类似的东西,得到了一个超出范围的索引。除了你使用了其中一个数组中的所有数字,你不能再进行比较了,因为索引(
j
k
)已经超出了最后一个索引。因此,您需要额外的代码来将来自另一个数组的剩余数字放入答案中。好的,我想我现在明白了。在这种情况下,由于每个数组中的每个其他数字都是下一个,没有这两个额外的循环,所以我没有得到binaryArr数组中的最后一个元素,因为它具有最高的最后一个数字。所以在这种情况下,我可以去掉这两个while循环,只分配最后一个binaryArr,因为我知道这是怎么回事?这不会被认为是坏代码吧?我能问你最后一个问题吗…为什么Collin给出的上面的代码给出了越界例外?对不起,我不明白你的意思。您无法避免在初始循环之后执行某些操作,因为合并尚未完成。而且你不能仅仅从
binaryArr
中获取最后几个数字,因为你不知道你需要从哪个数组中获取它们。我真的认为你应该用一个调试器来解决这个问题。一切都将变得明朗。
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));