1

私のバブルソートコードは、最初の配列アイテムのみを交換しています。他のすべての項目は0のままです。ネストされたループが間違っているか、まだ正しく診断できていないと思います。これが私のコードです。

    public void swap(int i, int j) {

    int temp;

    temp = i;
    i = j;
    j = temp;
}


public void sortArray(int [] sourceArray, int [] targetArray, int allArraySize){

    for(int i = 0; i < allArraySize; i++) {
        targetArray[i] = sourceArray[i];
        for (i = 0; i < allArraySize; i++) {
            for(int j = i+1; j < allArraySize;j++) {
                if(targetArray[i] > targetArray[j]) {
                    swap(i, j);
                }
            }

        }

    }
}

フィードバックをありがとうございました。私は(明らかに)プログラミングに不慣れです。コードをこれに変更しました。

public void sortArray(int [] sourceArray, int [] targetArray, int allArraySize){
    int temp;

    for(int i = 0; i < allArraySize; i++) {
        targetArray[i] = sourceArray[i];
        for (i = 0; i < allArraySize; i++) {
            for(int j = i+1; j < allArraySize;j++) {
                if(targetArray[i] > targetArray[j]) {
                    temp = targetArray[i];
                    targetArray[i] = targetArray[j];
                    targetArray[j] = temp;
                }
            }

        }

    }
}

結果はまだ1つのアイテムを交換するだけですが、今では最後の1つです。誰かがまだ助けてくれるなら、私はそれを大いに感謝します。

4

3 に答える 3

3

その理由は、この投稿で詳しく説明されています。要約すると、Javaは引数を値で渡し、swapメソッドはローカル変数のみをスワップしますが、sortArrayメソッド内の変数には影響しません。

簡単な修正は、のコードをにswap直接含めることですif。注:残りのコードはチェックしていません。たとえば、インデックスではなく、配列内の要素を交換することを意図している可能性があります。

于 2012-11-25T18:43:17.383 に答える
1

iカウンターを2回使用しています。

for(int i = 0; i < allArraySize; i++) {
    targetArray[i] = sourceArray[i];
        for (i = 0; i < allArraySize; i++) {
        ...

おそらく、内側のループが、外側のループで使用されているiカウンターを上書きしている可能性があります。

于 2012-11-25T18:45:24.557 に答える
0

(これはStackoverflowへの私の最初の投稿であることに注意してください。私は多くの言語でプログラミングしましたが、どれも本当にOOではありません。空き時間に1か月ほどJavaを攻撃しています。)

msg 1の元のコードと同様に、「分割統治」の一環としてPascalやVBasicなどでうまく機能する(そして推奨される)ため、別の手順でスワッピングを行う必要があると感じました。 「プログラミングの練習。ですから、私にとっても非常に不可解でした。なぜ、同じスワップルーチンがJavaで機能しなかったのか...パラメータの受け渡しについて読み直すまでは。内容を変更するには、配列自体を渡す必要があることがようやく頭に浮かびました。

public static void swap(int [] a, int i, int j) {
    int c  = a[i];
      a[i] = a[j];
      a[j] = c;
  }

上記は私にとってはうまくいきました、そして私がJavaを吸収するのに苦労したのと同じくらい、私は実際に私がそれを理解したことを誇りに思っています。しかし、そうねえ....困惑するかなり日常的なことですね。

一方で、参考までに何を意味するのか、どう対処するのかを学んだと思います。

そして、私は無意識のうちにスワップメソッドの動作をカプセル化し、それによってオブジェクト指向の信条に従っていると思います。だから...ダブルグッド?

しかし、これは私に尋ねさせます:この程度までソートを「分割統治」するのはただのばかげた考えですか?結局のところ、3行のスワップルーチンを残りのソートルーチンとインラインで移動することは常識ですが、私のスワップ方法はばかげているだけですか、それとも「最良」ではないにしても、少なくとも「良い」Javaプラクティスですか?

于 2013-09-01T19:40:57.907 に答える