簡體   English   中英

在java中合並兩個排序的數組

[英]Merge two sorted arrays in java

我知道有類似的問題已被問及我研究了很多網站。 我試圖使用一些答案,但我的代碼仍然無法正常工作。

我正在完成以前的任務,以幫助建立我的Java知識。 請原諒我的代碼中的任何錯誤,我還在學習Java。

這是我的問題:

實現一個方法合並,給定兩個排序整數元素數組,返回一個新的排序數組,其中包含兩個輸入數組的所有元素。

假設兩個輸入數組中的元素按非遞減順序排序(例如[0,1,2,2]和[1,2,3,3,4,5])。 返回的“合並”數組必須保留此屬性(例如[0,1,1,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;

    }
}

這在互聯網上的多個地方都有很好的解釋。 看看Java程序,合並兩個排序的數組 ,顯示算法的圖形說明。 您可以將您的方法更改為使用單個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;
}

嘗試為每個列表使用不同的索引。 不要將i用於兩個列表。

從概念上講,您將從一個列表中提取項目(並為該列表增加索引)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM