私は配列のサイズ以外のバイトを割り当てず、2つの命令に制限されているint配列のソートアルゴリズムを探しています:
SWAP:次のインデックスを現在のインデックスと交換します。
MOVE:カーソルを+1または-1インデックスに移動します。
つまり、indexを交換した100
だけでは、隣接していないインデックスを交換したり、インデックスを交換したりすることはできません10
。最も効率的なアルゴリズムは何ですか?つまり、総移動量が少ないアルゴリズムですか?
13
奇妙なことではありませんが、巻き上げられたテープに接着されたカートのリストをソートする物理マシンです。マシンはテープを前後にしか移動できず、隣接するカードのみを交換できます。現実の世界ではテレポートできないので、それらは制限です
—
...-MaiaVictor
したがって、配列のサイズ以外のバイトを割り当てないアルゴリズムが必要であると言うとき、要素のストレージのみを参照すると思いますか?私はまだカウンターなどを割り当てることができますか?
—
ダークホッグ
はい。もちろん。いくつかの追加構造を割り当てることができます。配列全体を割り当てて、非常に多くの計算を行うこともできますが、これは0コストとしてカウントされます。最小化する必要があるのは、遅いため、実際の物理マシンのSWAP / MOVEの数だけです。バブルソートは私が思いつくことができる最高のものですが、より良いオプションがあるはずだと思いました。
—
MaiaVictor
私はそのようなアルゴリズムがあるとは思わない。せずに任意の余分なメモリは、任意の制御状態を保存する方法がありませんよ。
—
ラファエル
@svrm:ええ、そして無制限のRAMとテープをRAMにコピーし、無料で任意の計算を行う機能を備えているため、「すべてを試して最適に適用する」アルゴリズムがテープの移動数の点で最適です。実用的ではないかもしれませんが、それは実際にはランタイムが0ではなく数億年であるためです;-)長さNのテープをRAMにコピーするのにNのコストがかかる場合、単純なブルートフォースは最適ではないかもしれませんが、N以内です最適の。しかし、これはあなたの問題に特有のものではありません。この方法で述べられた多くの問題は、偽のアルゴリズムを使用して「オフライン」で解決できます。
—
スティーブジェソップ