単純な構造体を考えてみましょう:
struct Node{
int val;
Node *next;
Node *freeNode;
};
ここで、指定されたリンク リストを freeNode のみを使用してソートする必要があり、メソッドは効率的でなければなりません。別のリストを作成して、そこである種のソート挿入を使用することはできません。ゲノムやバブルソートも使えません。リスト内の任意の要素のポインターfreeNode
は、リスト内の任意の要素を指すことができます。
今、私は2つのアイデアを思いつきました:
二重リンク リストを作成するには、freeNode を使用します。
そして、ペア比較を行います。つまり、i 番目の要素と (i+1) 番目の要素を比較します。2 つの要素を交換する必要があることがわかった場合は、それらを交換してから、リストの先頭から開始します。
このアルゴリズムは O(n) 以上になります (推測だけではわかりません)。時間がかかります。
もう 1 つの方法は、freeNode がそれより小さい elem を指すようにすることです。
たとえば、私が持っている
30->6->14->56>Tail
場合、56->freeNode->14 30->freeNode->14 14->freeNode->6 6->freeNode->NULL.
しかし、繰り返しますが、これはあまり役に立ちません。なぜなら、挿入するときにポインター
45 or 20
を再配置する必要があるからです。freeNode
繰り返しますが、これはあまり効率的な方法ではありません。
これに関する提案はありますか?freeNode
ソートのためのより優れた効率的な方法を実装するために使用する方法。疑似コードも機能しますが、私は実際のコードよりもその方が好きです。
編集:配列、ベクトルなどは使用できません。freeNode
ポインタだけ。好きなように使用してください。NULL のままにするか、選択した要素を指すようにします。