0
public class sortem {

/**
 * @param args
 */
private static void sort(int s[], int len){
    boolean swap = true;
    int upperBound = 0;
    while(swap){
        swap = false;
        for(int i=0;i<len-(upperBound+1);i++)
            if(s[i]> s[i+1]){
                int t=s[i];
                s[i]=s[i+1];
                s[i+1] = t;
                swap = true;

            }
        upperBound++;
    }
}
private static void print(int s[], int len){
    for(int i=0;i<len;i++)
        System.out.println(s[i]);

}
public static void main(String[] args) {
    int  size = 10;
    int s[] = new int [size];

    s[0] = 23; s[1] = 34; s[2] = 56; s[3] = 17; s[4] = 61;
    s[5] = 3;  s[6] = 92; s[7] = 44; s[8] = 19; s[9] = 63;
    sort(s, size);
    print(s, size);
}

}

これが私の質問です:

upperBound 変数は for ループの外側と while ループの内側にありますが、なぜこの変数が必要なのでしょうか。forループへの「制御」を理解しているかどうかはわかりません。私が最初にこれを自分で書いたとき、私はこの upperBound 変数を持っていなかったので、次のように i が配列の長さよりも大きくなるとループが終了しました。

for(int i = 0; i > len; i++)

それはうまくいきませんでした...このupperBound変数がループ境界の制御にどのように役立っているかを誰かが理解するのを手伝ってくれませんか? その横の +1 が最初の実行に必要であることがわかりますが、それは upperBound を 0 ではなく 1 に初期化するのと同じでしょうか?

4

1 に答える 1

1

for ループを初めて実行すると、最大の要素が配列の最後に配置されるという考え方です。2 回目は、2 番目に大きい要素が末尾の直前のインデックスに到達する、というように続きます。

ここで変数を指定することの背後にあるポイントupperBoundは、ループ時間を実行した後、配列kの最後の要素が正しい順序で最大の要素になるということです。したがって、ループ内でそれらを再度考慮する必要はありません (適切な場所にあることは既にわかっています)。ループを実行するたびに、別の要素が適切な場所に配置されるため、考慮する必要がある要素が 1 つ少なくなります (したがって、ループ条件が である理由は比較する要素の最後のペアは、以前の繰り返しで配置した要素)。kki < len - (upperBound+1)

于 2013-09-27T01:10:27.280 に答える