2016-08-06 3 views
2

Iはkが故意ナイーブな方法でアレイ(N要素とそれぞれ)をソートマージするためのアルゴリズムを実装しようとしている:ナイーブ方法

ステップ:

  1. 3アレイ
  2. と上記得られた配列は4アレイ
  3. と上記結果の配列をマージするマージ
  4. 第一および第二の配列をマージように
  5. ...と2Dアレイは6x6のになったときに私のコードを出力することができるソート単3×3の配列、4×、5×5の2次元アレイが、それのstucks K番目アレイ

とマージされるまで。

コードの複雑さが非常に悪くてコンパイルに時間がかかりすぎますか?それとも、私が気づいていないばかげた論理的なエラーがありますか?

私は自分のコードを読んでいますが、問題は "< < < ==== ??"とマークされた行だと思います。どうすればそれを正しくすることができますか?何が「合併後:」最後の行の後に示されていない。しかし、私はそれを終了するために強制されるまでプログラムがまだ実行されている

public class Merge { 

    // merge 2 arrays into a single sorted array 
    private static int[] merge(int[] arrayA, int[] arrayB) { 
     int n1 = arrayA.length;  // number of elements in arrayA 
     int n2 = arrayB.length;  // number of elements in arrayB 
     int[] mergeArray = new int[n1+n2]; 

     int i = 0;  // pointer of current index in mergeArray 
     int p1 = 0;  // pointer of current index in arrayA 
     int p2 = 0;  // pointer of current index in arrayB 
     while (p1 < n1 && p2 < n2) { 
      // put the lowest number the mergeArray until one of the array is done 
      if (arrayA[p1] < arrayB[p2]) { 
       mergeArray[i] = arrayA[p1]; 
       i++; 
       p1++; 
      } 
      else if (arrayB[p2] < arrayA[p1]) { 
       mergeArray[i] = arrayB[p2]; 
       i++; 
       p2++; 
      } 
     } 
     // if all elements of arrayA is copied to mergeArray, then copy remaining elements in arrayB to it 
     if (p1 >= n1) { 
      for (int j = p2; j < arrayB.length; j++) { 
       mergeArray[i] = arrayB[j]; 
       i++; 
      } 
     } 
     // if all elements of arrayB is copied to mergeArray, then copy remaining elements in arrayA to it 
     if (p2 >= n2) { 
      for (int j = p1; j < arrayA.length; j++) { 
       mergeArray[i] = arrayA[j]; 
       i++; 
      } 
     } 
     return mergeArray; 
    } 

    public static int[] naiveMerge(int[][] data) { 
     int k = data.length;  // number of sorted array 
     int n = data[0].length;  // number of elements in each array 
     int[] resultArray = new int[k*n]; 

     int[] tempArray = Merge.merge(data[0], data[1]); // merge the first two arrays 
     for (int i = 2; i < k; i++) { 
      // then merge in the third, fourth ... k arrays 
      tempArray = Merge.merge(tempArray, data[i]); // <<<==== ?? 
      resultArray = tempArray; 
     } 
     return resultArray; 
    } 
} 

プログラム

が好きこれを立ち往生。 program stuck

+0

コードをよくコメントして、何をしようとしているかお教えいただきありがとうございます。これをデバッグするためにこれまでに試したことと、その特定の行が問題だと思う理由についてもう少し詳しく教えてください。また、どんな具体的なエラーが出ていますか?プログラムはループしていますか?それは間違った値を返していますか? – templatetypedef

+0

コンソール出力の画像を添付しました。基本的には、エラーや例外は報告されませんが、ちょうどこのように立ち往生します。 – Matt

+0

私はその特定の行を指摘する理由は、デバッガを使用して各行をステップ実行するときです。 – Matt

答えて

2

3、4、5の配列を見ると、すべての配列のすべての値が純粋に一致していることが分かります。しかし、あなたの6つのケースでは、重複した値があることに気付きます(2つの46があります)。最初のwhileループをトレースしてmergeにトレースします。ある時点で2つの配列が同じ値を持つとどうなりますか?

幸運を祈る!

+0

私はそれを持っています!乾杯!! – Matt

関連する問題