在Java中合并两个排序的数组

时间:2018-11-18 20:47:32

标签: java arrays sorting

  

我知道有人问过类似的问题,并且我已经进行了研究   许多网站。我尝试使用一些答案,但是我的代码是   仍然无法正常工作。

     

我正在完成以前的任务,以帮助我积累知识   Java。请原谅我的代码中的任何错误,我仍在学习   Java。

     

这是我的问题:

实施一种方法合并,该方法将给定两个已排序的整数元素数组,并返回一个包含两个输入数组的所有元素的新的已排序数组。

假设两个输入数组中的元素均以非降序排列(例如[0,1,2,2]和[1,2,3,3,4,5])。返回的“合并”数组必须保留此属性(例如[0,1,1,2,2,2,2,3,3,4,5])。

输入和输出中均允许重复。

如果其中一个数组为null,则将非null数组作为副本返回;如果两个数组均为null,则结果也应为null。

效率要求:阵列应在阵列上一次通过合并。

  

这是我到目前为止所做的事情,它不符合要求,因此我需要帮助才能找到正确的解决方案:

public class MergeArray {
    public static int[] merge(int[] arr1, int[] arr2) {
        if (arr1 == null && arr2 == null) {
            return null;
        }
        if (arr1 != null & arr2 == null) {
            return arr1;
        }
        if (arr2 != null & arr1 == null) {
            return arr2;
        }
        int[] merged = new int [arr1.length+arr2.length];

        if (arr1.length > arr2.length) {
            for (int i = 0; i < arr1.length; i++) {

                if (arr1[i] <= arr2[i]) {
                    merged[i] = arr1[i];
                    merged[i + 1] = arr2[i];
                }
                if (arr2[i] < arr1[i]) {
                    merged[i] = arr2[i];
                    merged[i + 1] = arr1[i];
                }
            }
            if (arr1.length < arr2.length) {
                for (int i = 0; i < arr2.length; i++) {

                    if (arr1[i] <= arr2[i]) {
                        merged[i] = arr1[i];
                        merged[i + 1] = arr2[i];
                    }
                    if (arr2[i] < arr1[i]) {
                        merged[i] = arr2[i];
                        merged[i + 1] = arr1[i];
                    }
                }

            }

        }
        return merged;

    }
}

3 个答案:

答案 0 :(得分:3)

这在Internet上的多个地方都有很好的解释。看一下Java program to merge two sorted arrays,它显示了该算法的图形说明。您可以将方法更改为使用单个while循环,如下所示:

public static int[] merge(int[] arr1, int[] arr2) {
  if (arr1 == null && arr2 == null) return null;
  if (arr1 == null) return arr2.clone();
  if (arr2 == null) return arr1.clone();       

  int[] result = new int[arr1.length + arr2.length];
  int i = 0, j = 0, r = 0;
  while (i < arr1.length && j < arr2.length) {
    if (arr1[i] < arr2[j]) {
      result[r] = arr1[i];
      i++;
    } else {
      result[r] = arr2[j];
      j++;
    }
    r++;
  }
  // Copy the remaining elements in array 1 to result
  if (i < arr1.length) {
    System.arraycopy(arr1, i, result, r, (arr1.length - i));
  }
  // Copy the remaining elements in array 2 to result
  if (j < arr2.length) {
    System.arraycopy(arr2, j, result, r, (arr2.length - j));
  }
  return result;
}

答案 1 :(得分:1)

如果int数组已排序,并且您对java-8感兴趣,请在线进行

int[] arr1 = {1,2,2,3,4,4};
    int[] arr2 = {4,5,5,6,7,8,8};
    int[] mergedArray =Stream.concat(Arrays.stream(arr1).boxed(), Arrays.stream(arr2).boxed()).mapToInt(Integer::intValue).toArray();
    System.out.println(Arrays.toString(mergedArray)); //[1, 2, 2, 3, 4, 4, 4, 5, 5, 6, 7, 8, 8]

还可以通过使用IntStream(不需要装箱)

int[] mergArray =IntStream.concat(Arrays.stream(arr1), Arrays.stream(arr2)).toArray(); //[1, 2, 2, 3, 4, 4, 4, 5, 5, 6, 7, 8, 8]

答案 2 :(得分:0)

尝试为每个列表使用不同的索引。不要对两个列表都使用i

从概念上讲,您将从一个列表中拉出一个项目(并仅增加该列表的索引)。