私はデータ構造とアルゴリズムのコースを行っているコンピューターサイエンスの2年生です。私の教授は、挿入ソートはランダムアクセスを必要としますが、マージソートは必要ないと述べています。
彼によると、挿入ソートの挿入ステップにはランダムアクセスが必要です。しかし、リンクされたリストで順次アクセスを使用して実装することはできず、各要素を通過します。次のノードの要素が挿入したい要素よりも大きいことがわかるとすぐに、現在の要素の後にその要素を絞り込みます要素(昇順リスト用)。
彼が間違っていることはほとんどありませんが、疑いを抱くこともありません。私にお知らせください。ありがとう!
さて、私は theoretical CS スタック交換Webサイトでこの質問をしました。
ルイは私がこの質問に最も適切な答えだと思うものを与えました:
リンクリストの実装は、新しい値にスプライスするポインター操作のために、メモリに非順次的にアクセスできる必要もあります。
つまり、リンクされたリストの任意の場所に新しいノードを挿入するとき、ランダムアクセスがあると想定しています。そうでなければ、新しいノードを追加する前に、後続のすべてのノードをメモリ内で前にシフトする必要があります。
Wikipedia は挿入ポイントのバイナリ検索へのランダムアクセスを必要とする挿入ソートのバリアントを説明し、比較がスワップよりもはるかに高価である場合に便利であることに注意してください。これは「バイナリ挿入ソート」というラベルが付いていますが、これは教授が話していることかもしれません。
これは平均的で最悪の場合の複雑さはO(n ^ 2)スワップとO(nlogn)比較です。これは、メソッドのO(n ^ 2)スワップと比較よりも優れています。
O(logn) insertおよびO(logn) searchを使用して、ヒープなどのデータ構造を操作している場合、全体的になります。 O(nlogn)これは通常、ヒープソートまたは同様のものとして記述されます。