前半と後半の両方が独立してソートされている整数のリンクリストがあります。次に、2つの部分をマージして、1つの単一のソートされたリンクリストを作成する必要があります。
サンプル入力:
入力リスト1:1->2->3->4->5->1->2
出力: 1->1->2->2->3->4->5
入力リスト2:1->5->7->9->11->2->4->6
出力2:1->2->4->5->6->7->9->11
期待される出力:
1,2,3....。
前半と後半の両方が独立してソートされている整数のリンクリストがあります。次に、2つの部分をマージして、1つの単一のソートされたリンクリストを作成する必要があります。
サンプル入力:
入力リスト1:1->2->3->4->5->1->2
出力: 1->1->2->2->3->4->5
入力リスト2:1->5->7->9->11->2->4->6
出力2:1->2->4->5->6->7->9->11
期待される出力:
1,2,3....。
これがマージソートです。
私は2つの指針を維持します:
ptr1
前半の最初の要素を指す
ptr2
後半の最初の要素を指します。
最終的なリストを格納するために追加の配列が必要になります。もちろん、この追加の配列を使用しないことを選択することもできますが、その議論はトピックから遠く離れています。
1, を比較*ptr1
し*ptr2
、*ptr1
の値が より小さい場合*ptr2
、その値 (つまり*ptr1
) を最後の配列にコピーし、ptr1
先に進めます。
ptr2
の値が小さい場合は、コピーし*ptr2
てptr2
先に進めます
2、ポインターが最後の要素の後ろを指しているときに停止します。たとえば、前半に5つの要素があるa[0] a[1] a[2] a[3] a[4]
場合、ポインターが次の要素を指しているときに停止する必要があります
a[5]
3,前半が空なら後半をコピー、逆も同様。
私は関数型言語を使用する際に数え切れないほどの時間を費やしてきたので、簡単に説明できると思います。
再帰的なプロセスと考えた方がアイデアが理解しやすいのですが、ここでは必須のプロセスについて説明します。部分リストと空のソート済みリストの両方から始めます。
次に、ループを開始すると、部分リストは次のように表示されます。
ループから抜けたら、ソートされたリストを返すだけです。
ただし、注意点が 1 つあります。単純なリンク リストを使用している場合は、並べ替えられたリストの前に要素を追加し、最後に元に戻してから返すことで、実行時間を短縮できます。
これはマージソートと呼ばれます。
実装の詳細については、こちらとこちらをご覧ください。
最適なソリューションの自然マージ ソートを探します: http://en.wikipedia.org/wiki/Merge_sort#Natural_merge_sort