ほとんどの比較/交換ソートでは、ほとんどの場合、変更されている配列をソートできるはずです。挿入ソートとシェルソートは確かにできます。バブルソートや選択ソートも可能です。私はQuicksortについて完全にはわからない。ソートの途中でデータ値が変更された場合、いくつかの実装が無限ループに陥る可能性があります。
単純な挿入の場合を考えてみましょう。配列[4, 7, 5, 3, 2]
から始めます。
数回反復した後は、[3, 4, 5, 7, 2]
となります。この時点で、誰かが入り込んで4
を1
に変更し、[3, 1, 5, 7, 2]
となります。あなたの並べ替えは、最後の項目、2
を配置しようとしています。最終的には[3, 1, 2, 7, 5]
となります。最後の配列は最終的な配列のようになります。
頻繁に変更されない配列では、いくつかのアイテムが不足している可能性が高く、挿入ソートではすぐに物事を整理できます。
あなたの実装には注意が必要です。他のスレッドが配列を変更する可能性があるため、配列項目の内容を保持する一時変数を持つことはできません。配列内の項目が変更されない参照(つまり、参照されているものだけが配列内の要素ではなく変更可能)である場合、その参照を一時的に保持することは問題ありません。しかし、もし配列が、例えば整数の配列なら、すべての比較は一時的な値を保持するのではなく、実際の配列要素に対して行わなければなりません。
つまり、このようなことはかなり珍しいことです。多くの順序付けられたデータ構造は、複数のスレッドが同時に読み書きすることができるようにロックフリーになるようにコーディングすることができます。これにより、データ構造が常に順序を維持するため、「ほぼ」ソートする必要がなくなります。
[私は出版物について知らない]このようなことは、注文が比較的安定的かつ比較的重要でない場合に発生する。例:候補者がチェスエンジン内の特定の位置に移動し、コストまたは利益によって発注されます。または、シミュレーションで確率的ベクトルを使用した重み付きサンプリング。多くの場合、1パスのバブルソート、または挿入/選択の種類のスキームが使用されます。 – wildplasser