2
    int [] queue1 = {4,7,2,9,12,35,8,49};
    int [] queue2 = {24,53,6,19,41,71,1,68,11,32,99}        
    int[]mergeQ = new int[queue1.length + queue2.length];

    for(int i=0; i < queue1.length; i++ )
    {

      mergeQ[i*2] = queue1[i];       
      mergeQ[i*2+1] = queue2[i];  
    }
    for(int i=0; i < mergeQ.length; i++) {            
        System.out.print(mergeQ[i]+",");
    }

出力:4,24,7,53,2,6,9,19,12,41,35,71,8,1,49,68,0,0,0

queue2の残りの要素を印刷するにはどうすればよいですか?

4

6 に答える 6

6

マージアルゴリズムは、次のことを前提としていqueue1.length < queue2.lengthます。あなたのプログラムにとっては正しいですが、そのような仮定をすることは一般的に良いことではありません。

短い方の配列の長さに達するまで両方の配列を通過するようにマージアルゴリズムを変更してから、長い方の配列の残りの要素をマージされた配列の末尾にダンプします。次のように、すべてを1つのループで実行できます。

int p = 0;
for (int i = 0 ; i < queue1.length || i < queue2.length ; i++) {
    if (i < queue1.length) {
        mergeQ[p++] = queue1[i];
    }
    if (i < queue2.length) {
        mergeQ[p++] = queue2[i];
    }
}
于 2012-12-01T13:50:34.043 に答える
1

これを行う1つの方法は次のとおりです。

    int[] queue1 = { 4, 7, 2, 9, 12, 35, 8, 49 };
    int[] queue2 = { 24, 53, 6, 19, 41, 71, 1, 68, 11, 32, 99 };
    int[] mergeQ = new int[queue1.length + queue2.length];

    int dest = 0;
    int src1 = 0;
    int src2 = 0;
    while (src1 < queue1.length || src2 < queue2.length) {
        if (src1 < queue1.length) {
            mergeQ[dest++] = queue1[src1++];
        }
        if (src2 < queue2.length) {
            mergeQ[dest++] = queue2[src2++];
        }
    }

    for (int i = 0; i < mergeQ.length; i++) {
        System.out.print(mergeQ[i] + ",");
    }

これは、短いかどうかに関係なく機能しqueue1ます。queue2

また、2つのキューの要素がインターリーブされるというアルゴリズムのプロパティも保持されます。それが重要でない場合は、すべてをへの2回の呼び出しで置き換えることができますSystem.arraycopy()

于 2012-12-01T13:51:35.073 に答える
0

どのアレイが長いかを確認してください。2つの違いのカウンターを保持します。コードを少し変更する...もう少し非正統的...しかしもう少しきれい

int [] queue2 = {24,53,6,19,41,71,1,68,11,32,99};

int[]mergeQ = new int[queue1.length + queue2.length];

int larger=queue1.length;
int smaller=queue2.length;

if(queue1.length < queue2.length)
  {
   larger=queue2.length;
   smaller=queue1.length;
  }

    for(int i=0; i < queue1.length; i++ )
    {
      mergeQ[i*2] = queue1[i];       
      mergeQ[i*2+1] = queue2[i];

    }

    for(int i=mergeQ.length; i < queue2.length; i++ )
    {
       mergeQ[i] = queue2[larger-smaller];
       smaller++;
    }

    for(int i=0; i < mergeQ.length; i++){


        System.out.print(mergeQ[i]+",");
    }

これはあなたのためにそれをする必要があります

于 2012-12-01T13:58:32.133 に答える
0

休耕コードはすべての要素をマージキューに配置しますが、2つのキューをマージする順序(キュー1の要素がキュー2の要素によって休耕されるなど)があったかどうかはわかりません。

int [] 
    queue1 = {4,7,2,9,12,35,8,49},
    queue2 = {24,53,6,19,41,71,1,68,11,32,99},
    mergeQ = new int[queue1.length + queue2.length];

for (int i=0; i < queue1.length; i++ )
    mergeQ[i] = queue1[i];

for (int i = 0; i < queue2.length; i++)
    mergeQ[queue1.length + i] = queue2[i];

for(int i=0; i < mergeQ.length; i++)
    System.out.print(mergeQ[i]+",");
于 2012-12-01T13:50:17.710 に答える
0
int[] queue1 = {4,7,2,9,12,35,8,49};
int[] queue2 = {24,53,6,19,41,71,1,68,11,32,99}        
int[] mergeQ = new int[queue1.length + queue2.length

int i=0;
for(; i < queue1.length; i++ ){
  mergeQ[i*2] = queue1[i];       
  mergeQ[i*2+1] = queue2[i];
}
if(queue1.length>queue2.length){ 
 for(int j=i;j<queue1.length;j++)
  mergeQ[j+2] = queue1[j];
}else if(queue1.length<queue2.length){
 for(int j=i;j<queue2.length;j++)
  mergeQ[j+2] = queue2[j];
}
于 2012-12-01T13:56:07.340 に答える
0

入力:{1、3、5、7}および{2、4、6}出力:{1、2、3、4、5、6、7}}

        int c[] = {2, 4, 6, 8};
        int n[] = {1, 3, 5, 7, 9};
        int f = 0;
        int res[] = new int[c.length + n.length];
        for(int i=0;i<(c.length + n.length); i++)
        {
            if(c.length > n.length)
            {
                if(i<c.length)
                    res[f++] = c[i];
                else if(f<=res.length-1)
                    res[f++] = c[i];

                if(i<n.length)
                res[f++] = (char) n[i];
            }else{
                if(i<n.length)
                    res[f++] = n[i];
                else if(f<=res.length-1)
                    res[f++] = n[i];

                if(i<c.length)
                res[f++] = (char) c[i];
            }

        }
        for(int i=0;i<res.length;i++)
        {
            System.out.print("   "+res[i]);
        }
    }
}
于 2014-05-13T13:57:22.760 に答える