0

以下のように、2 つの異なる方法で挿入ソートの実装を見てきました。

方法 1:

        for (int out = 1; out < numbers.length; out++) {

        int temp = numbers[out];
        int in = out - 1;
        while (in >= 0 && numbers[in] > temp) {

            numbers[in + 1] = numbers[in];
            numbers[in] = temp;
            in--;
        }

        }

方法 2:

int S[] = { 20, 25, 10};
    int N = S.length;

    for (int i = 1; i < N; i++) {
        int j = i - 1;
        int temp = S[i];

        while (j >= 0 && S[j] > temp) {
        S[j + 1] = S[j];
        j--;
        }

        S[j + 1] = temp;
    }

しかし、2番目のアプローチで、スワップがwhileループの外にある理由がわかりませんか? while ループの外側に置く理由はありますか?

4

2 に答える 2

0

2 つのバージョンは機能的に同等です。後者は単に不必要な作業を避けるだけです。

最初のバージョンでは、次の割り当て

numbers[in] = temp;

ループが続く場合、ループの次の繰り返しで元に戻されます。temp2 番目のバージョンでは、この事実に注意して、ループが完了するまで元に戻すことを気にしません。

于 2012-12-11T12:18:26.143 に答える
0

基本的にはどちらも同じですが、最初のものでは、要素 [in + 1] にコピーしたものに一時番号を即座に書き込むだけです。2 番目の例では、while ループが終了するまで待機します。したがって、時間を節約するだけです。

于 2012-12-11T12:18:53.167 に答える