4

したがって、基本的に 2 つの別個の事前に並べ替えられた配列があり、それらを組み合わせて並べ替える必要があります (もちろん、sort() メソッドは使用しません)。これが私のコードです:

public static void main(String[] args) {

    int a [] = {3,5,7,9,12,14, 15};
    int b [] = {6 ,7, 10};
    int j = 0;

    //output array should be 3,5,6,7,7,9,10,12,14,15

    int c [] = new int[a.length+b.length];//10 values

    for (int i = 0;i<b.length;i++){
        while(b[i]>a[j]){
            c[j] = a[j] ;
            j++;    
         }

        if(b[i] == a[j]){
            c[j] = b[i];
            c[j+1] = a[j];
        }

        c[j] = b[i];
        j++;
    }

    for(int i = 0;i<c.length;i++)
        System.out.println(c[i]);
    }

私が得ているゼロは、ブール値 (< & >) のいずれかの間違いによるものだと推測していますが、それを理解できないようです。最初の 4 回は問題なく動作しますが、7 回が繰り返されると、おかしくなりました。

コードを変更するだけでなく、理解してください。

4

6 に答える 6

6

これは、簡単な方法である必要があります。

public static void main(String[] args) {

    int a [] = {3,5,7,9,12,14, 15};
    int b [] = {6 ,7, 10};
    int j = 0, k = 0;

    //output array should be 3,5,6,7,7,9,10,12,14,15

    int c [] = new int[a.length+b.length];//10 values

    // we're filling c with the next appropriate number
    // we start with checking a[0] and b[0] till we add
    // all the elements
    for (int i = 0; i < c.length; i++) {
        // if both "a" and "b" have elements left to check
        if (j < a.length && k < b.length) {
            // check if "b" has a smaller element
            if (b[k] < a[j]) {
                // if so add it to "c"
                c[i] = b[k];
                k++;
            }
            // if "a" has a smaller element
            else {
                // add it to "c"
                c[i] = a[j];
                j++;
            }       
        }
        // if there are no more elements to check in "a"
        // but there are still elements to check in "b"
        else if (k < b.length) {
            // add those elements in "b" to "c"
            c[i] = b[k];
            k++;
        }
        // if there are no more elements to check in "b"
        // but there are still elements to check in "a"
        else {
            // add those elements in "a" to "c"
            c[i] = a[j];
            j++;
        }
    }

    for(int i = 0; i < c.length; i++)
        System.out.println(c[i]);
}

それが役に立てば幸い。

于 2012-06-22T21:44:01.097 に答える
1

このコードを試すことができます。

public static void main(String[] args) {
    int a[] = { 3, 5, 7, 9, 12, 14, 15 };
    int b[] = { 6, 7, 10 };

    // output array should be 3,5,6,7,7,9,10,12,14,15

    int alen = a.length;
    int blen = b.length;
    int c[] = new int[a.length + b.length];// 10 values

    int s[] = null;
    int[] l = null;

    if (alen < blen) {
        s = a;
        l = b;
    } else {
        s = b;
        l = a;
    }
            // Constructing Combined Array
    for (int i = 0, p = 0; i < c.length; i++, p++) {
        if (i == s.length) {
            p = 0;
        }
        if (i < s.length) {
            c[i] = s[p];
        } else {
            c[i] = l[p];
        }
    }
            //Sorting the C array 
    for (int i = 1; i < c.length; i++) {
        int j = i;
        int B = c[i];
        while ((j > 0) && (c[j - 1] > B)) {
            c[j] = c[j - 1];
            j--;
        }
        c[j] = B;
    }

    for (int i = 0; i < c.length; i++)
        System.out.print(c[i]);
}
于 2012-06-22T21:53:35.327 に答える
0

aiおよびbiを両方のソース配列ciのインデックスとして、および宛先配列のインデックスとして使用します。

必要なループは1つだけです。

これを非常に明確に保ちc、​​各反復で正確に1つの要素で前進するようにしてください。

ループで、1つの配列の終わりに到達したかどうかを確認します。その場合は、他の配列から要素を取得します。a[ai]それ以外の場合は、との小さい方の要素のみを取得しb[bi]、対応するインデックスをインクリメントします。

マージソート(または2つの配列を並行してウォークする必要があるコード)で「ifを1つだけ実行するのではなく、whileループを実行できる」と考えると、間違いを犯しやすくなりますが、通常は次のようになります。 2つのループが3つ目のループにネストされており、ループごとに右境界チェックを実行する必要があります。通常、パフォーマンスは大幅に向上しません。

psメインループを1つ実行し、メインループの後にクリーンアップループを2つ実行しても問題ありません。特に、ランタイムの計算時に混乱を引き起こす可能性があるインタビューでは、ネストされたループが不要な場合は避けてください。

于 2012-06-22T21:37:45.537 に答える
0

実際には、 2 つの配列をマージする(結合するのではなく) と言った方が適切です。

ソートされた配列AB[0..n-1]を結果C[0..m+n-1]にマージするための単純なアルゴリズム (この記事から取得) :

  1. それに応じて、配列A[0..m-1]およびBをトラバースするために、読み取りインデックスijを導入します。結果の配列に最初の空きセルの位置を格納するための書き込みインデックスkを導入します。デフォルトでは、i = j = k = 0 です。
  2. 各ステップで: 両方のインデックスが ( i < mおよびj < n ) の範囲内にある場合、( A[i]B[j] ) の最小値を選択し、それをC[k]に書き込みます。それ以外の場合は、手順 4 に進みます。
  3. kと配列のインデックスを増やします, アルゴリズムはで最小値を見つけました, 1. 手順 2 を繰り返します。
  4. インデックスがまだ範囲内にある配列から残りの値を結果の配列にコピーします。

それが役に立てば幸い。

于 2012-06-22T21:31:07.407 に答える
0

これを試してください。エラーは、配列 A と配列 C に同じセルラー インデックスを使用していることです。

public class MainClass {
      public static void main(String[] args) {
        int[] arrayA = { 23, 47, 81, 95 };
        int[] arrayB = { 7, 14, 39, 55, 62, 74 };
        int[] arrayC = new int[10];

        merge(arrayA, arrayA.length, arrayB, arrayB.length, arrayC);
        for (int i : arrayC) {
          System.out.println(i);

        }
      }

      public static void merge(int[] arrayA, int sizeA, int[] arrayB, int sizeB, int[] arrayC) {
        int arrayAIndex = 0, arrayBIndex = 0, arrayCIndex = 0;

        while (arrayAIndex < sizeA && arrayBIndex < sizeB)
          if (arrayA[arrayAIndex] < arrayB[arrayBIndex])
            arrayC[arrayCIndex++] = arrayA[arrayAIndex++];
          else
            arrayC[arrayCIndex++] = arrayB[arrayBIndex++];

        while (arrayAIndex < sizeA)
          arrayC[arrayCIndex++] = arrayA[arrayAIndex++];

        while (arrayBIndex < sizeB)
          arrayC[arrayCIndex++] = arrayB[arrayBIndex++];
      }
    }

これは別のバージョンです

// size of C array must be equal or greater than
// sum of A and B arrays' sizes
public void merge(int[] A, int[] B, int[] C) {
      int i, j, k, m, n;
      i = 0;
      j = 0;
      k = 0;
      m = A.length;
      n = B.length;
      while (i < m && j < n) {
            if (A[i] <= B[j]) {
                  C[k] = A[i];
                  i++;
            } else {
                  C[k] = B[j];
                  j++;
            }
            k++;
      }
      if (i < m) {
            for (int p = i; p < m; p++) {
                  C[k] = A[p];
                  k++;
            }
      } else {
            for (int p = j; p < n; p++) {
                  C[k] = B[p];
                  k++;
            }
      }
}
于 2012-06-22T21:34:12.070 に答える