java中两个排序数组的合并

lbsnaicq  于 2021-07-11  发布在  Java
关注(0)|答案(2)|浏览(349)
public static int[] merge(int arr1[], int arr2[]) {
    int x = arr1.length + arr2.length;
    int[] arr3= new int[x];
    x=0;
    int i =0, j=0;
    while ( i<arr1.length||j<arr2.length)
    {
        if(arr1[i]<arr2[j])
        {
            arr3[x]= arr1[i];
            i++;
            x++;
        }
        else 
        {
            arr3[x]=arr2[j];
            j++;
            x++;
        }

    }
    return arr3;
}

有人能解释一下这个节目有什么问题吗?
如果一个数组为空,如何合并数组?
example:-
给定输入:-1st的数组大小=5
1 2 3 4 5
第二个的数组大小=0

jbose2ul

jbose2ul1#

简短版本:

System.arraycopy(arr, 0, arr3, 0, arr.length);
System.arraycopy(arr2, 0, arr3, arr.length, arr2.length);
return Arrays.sort(arr3);

自己实施:
也许您应该检查其中一个数组是否为null,如果某个数组比另一个数组长,还应该移动剩余的数组。另外,在检查是否到达数组末尾时,也许应该使用&&而不是| |来避免异常

public static int[] merge(int arr1[], int arr2[]) {
    // Checking for null arrays
    if (arr1 == null){
        return arr2;
    }
    if (arr2 == null){
        return arr1;
    }
    int x = arr1.length + arr2.length;
    int[] arr3= new int[x];
    x=0;
    int i =0, j=0;
    while (i<arr1.length && j<arr2.length) // This is where your exception occurs
    {
        if(arr1[i]<arr2[j])
        {
            arr3[x]= arr1[i];
            i++;
            x++;
        }
        else
        {
            arr3[x]=arr2[j];
            j++;
            x++;
        }

    }
    // Copying leftovers
    if (i < arr1.length){
        while(i < arr1.length){
            arr3[i + j] = arr1[i];
            i++;
        }
    }
    if (j < arr2.length){
        while (j < arr2.length){
            arr3[j + i] = arr2[j];
            j++;
        }
    }
    return arr3;
}
gc0ot86w

gc0ot86w2#

让我们对你的程序进行一次试运行。假设arr1={2}和arr2={1,3}。
声明和初始化部分是正确的。

//All correct here
    int x = arr1.length + arr2.length;
    int[] arr3= new int[x];
    x=0;
    int i =0, j=0;

现在控制传递到循环

while (i < arr1.length || j < arr2.length)

检查第一个条件。

if(arr1[i] < arr2[j])    //2 < 1 returns false

程序控制传递给else并执行以下所有语句。

arr3[x]=arr2[j];
    j++;
    x++;

现在循环中的下一次i=0,j=1,x=1。再次记住,如果条件被检查。这次是2<3。返回true并执行下面的部分。

arr3[x]= arr1[i];
    i++;
    x++;

现在在循环中,i=1,j=1,x=2的值。麻烦就从这里开始。

while (i < arr1.length || j < arr2.length) //1 < 1 || 1 < 2
                                               //returns true

如果条件已检查。

if(arr1[i] < arr2[j])    //ArrayIndexOutOfBoundsException

发生这种情况是因为当i的值达到其长度时,必须停止检查条件。
在while循环中使用这个,

if (i == arr1.length)     //if all the elements of arr1 are already checked...copy arr2 leftover elements
        arr3[x] = arr2[j++];
    else if (j == arr2.length)//if all the elements of arr2 are already checked...copy arr1 leftover elements
        arr3[x] = arr1[i++];
    else if (arr1[i] <= arr2[j])
        arr3[x] = arr1[i++];
    else 
        arr3[x] = arr2[j++];

    x++;

对于问题的第二部分,只需检查数组是否为null。

if (arr1 == null) return arr2;
    else if (arr2 == null) return arr1;
    else
    {
         //Perform merge
    }

我希望我帮了你。

相关问题