合并两个数组时出错

时间:2015-03-31 06:28:07

标签: java mergesort

我有两个排序的数组arr1和arr2,我试图将这两个数组合并到另一个数组'output'中。 但问题是如果第一个数组耗尽,即数组arr1被完全使用,则'i'的值将大于数组的长度,因此在下一次迭代时arr [i]给出错误。可以做些什么来避免这种情况?

    int i=0;
    int j=0;

    for(int k=0;k<output.length;k++) {      

            if(arr1[i]<arr2[j]) {
                output[k]=arr1[i];
                i++;
            }


            else{           
                   output[k]=arr2[j];
                   j++;         
            }       

    }

2 个答案:

答案 0 :(得分:0)

您需要检查阵列是否已耗尽:

int i=0;
int j=0;

for(int k=0;k<output.length;k++) {      
    if(i < arr1.length && j < arr2.length) { 
        // both arrays still have unused elements
        if (arr1[i]<arr2[j]) {
            output[k]=arr1[i];
            i++;
        } else {           
           output[k]=arr2[j];
           j++;         
        } 
    } else if (i < arr1.length) {
        // only the first array has unused elements
        output[k]=arr1[i];
        i++;   
    } else if (j < arr2.length) {
        // only the second array has unused elements
        output[k]=arr2[j];
        j++; 
    } 
}

答案 1 :(得分:0)

我们可以利用k的值不必检查的事实,因为输出数组的长度等于arr1和arr2的长度之和。一旦任一阵列的元素耗尽,我们就退出main for循环(因此条件i&lt; arr1.length&amp;&amp; j&lt; arr2.length)。现在,由于其中一个数组已经耗尽,我们只需要将另一个数组的所有剩余元素转储到输出数组中。因此我们检查条件是否i!= arr1.length,如果为真,则表示j等于arr2.length,因此arr2已用尽,并且arr1的元素必须被转储到输出数组中。否则,我们将剩余的arr2元素转储到输出数组中。

int i=0;
int j=0;

for(int k=0;i<arr1.length && j < arr2.length ;k++) {      

        if(arr1[i]<arr2[j]) {
            output[k]=arr1[i];
            i++;
        }


        else{           
               output[k]=arr2[j];
               j++;         
        }       

}
if(i != arr1.length){
    for(; i < arr1.length; i++,k++)
    output[k]=arr1[i];
}
else{
    for(; j < arr2.length; j++,k++)
    output[k]=arr2[j];
}