事前に入力された単一の配列で動作し、1種類の書き込み操作のみを実行するように制限されている並べ替えアルゴリズムが必要です。
O =アイテムXをインデックスYに移動します。後続の位置の要素は1位置シフトされます。
アルゴリズムは、可能な限り少ない操作数に合わせて最適化する必要がありますO。読み取り操作は、書き込み操作よりも無限に安価です。一時的なヘルパーリストも安いです。
編集:実装は私には隠されていますが、その動作のために、リンクリストと呼ぶ方が正しいかもしれません。
バックグラウンド:
問題は、リストでこの操作を実行することしかできないGoogleAPIに取り組んでいることです。操作はWebサービス呼び出しです。通話回数を最小限に抑えたい。ソートプログラム(クライアント)が開始する前にメモリ内にリストのコピーを持っていると想定できるため、サービスに対して読み取り操作を実行する必要はなく、書き込みのみを実行します。もちろん、リストの複製や既存の.NETソート関数の使用など、サービス呼び出しを実行する前に、ローカルで任意の量の一時的なリストアクションを実行することもできます。
ここでどのように進めますか?ここで使用できる既知のアルゴリズムはありますか?
失敗した試行:
私はすでにダムアルゴリズムを実装しましたが、すべての場合に最適というわけではありません。リストが次のような場合にうまく機能します。
リストA=[2,3,4,5,6,7,8,9,1]
こんなふうになります:
- リストはソートされていますか?いいえ
- 位置0に属する要素を検索: "1"
- 要素「1」を位置0に移動します
- (新しいリストの状態A1
[1,2,3,4,5,6,7,8,9]
:) - リストはソートされていますか?はい。終わり
...しかし、リストがこのような場合、私はトラブルに巻き込まれます:
リストB=[9,1,2,3,4,5,6,7,8]
- リストはソートされていますか?いいえ
- 位置0に属する要素を検索: "1"
- 要素「1」を位置0に移動します
- (新しいリストの状態B1
[1,9,2,3,4,5,6,7,8]
:) - リストはソートされていますか?いいえ
- 位置1:「2」に属する要素を検索します
- 要素「2」を位置1に移動します
- (新しいリストの状態B2
[1,2,9,3,4,5,6,7,8]
:) - ...あなたは私がここに行くところを見ることができます...