2

ポインタやその他の高度な関数の管理の経験はあまりありませんが、毎回値をコピーして移動する代わりに、ポインタを使用して配列の2つの要素間でメモリアドレスを交換するアルゴリズムを作成できるかどうかを考えていました(ソート中の例)。説明させてください:

この配列を想像してみてください。10個の要素が並べ替えられていません。バブルソートを使用して(任意の順序で)並べ替えるふりをします。一般的な方法は、2次変数を使用して要素をコピーし、小さいものを見つけるたびにバイパスとして使用することです。以上の数(降順または昇順の並べ替えによって異なります)。

            *----*----*----*----*----*----*----*----*----*----*
array[10] = | 45 | 21 | 32 | 48 | 32 | 22 | 47 | 10 | 11 | 12 |
            *----*----*----*----*----*----*----*----*----*----*
            ^----- Imagine this is 10000

プログラムは、array[1]がarray[0]よりも小さいことを認識しているため、バブルソートは2次変数をバイパスとして使用して値を交換します(これが一般的な方法です)。

                   *--------------* 
                   |              ^
                   |              |
            *--------------*--------------*----*----*----*----*----*----*
array[10] = |      45      |      21      | 32 | 22 | 47 | 10 | 11 | 12 |
            *--------------*--------------*----*----*----*----*----*----*
                   |              ^
                   |   *------*   |
                   *-->|BYPASS|---*
                       *------*

では、&array [0]や&array [1]アドレスを交換するようなことを言うことはできませんか?だから私は二次変数を避けますか?この場合、&array [1] = 10000; および&array [0]=10004。

ご清聴ありがとうございました。すべての提案が許可されています。

4

1 に答える 1

1

あなたはこれを行うことができます

 array[0] += array[1];
 array[1] = array[0] - array[1];
 array[0] -= array[1];

3番目の変数は使用しないでください。

配列は、連続した連続したメモリ空間です。注文を効率化することはできません。LinkedListではなく、そのようなポインタを交換するだけです。

于 2012-11-03T15:05:33.387 に答える