並べ替えのために 2 つの要素で実際の比較/交換が行われるのはどこですか? Ord
これは、 (順序付けられた) 型定義自体によって処理されますか。では、型はこの順序付けの条件を強制するのでしょうか?
とはOrd
どういう意味ですか?
Ord
just は、a
それ自体と比較可能であること、またはより厳密に言えば>
、 、<
、およびなどの操作==
を に対して定義する必要があることを意味しa
ます。メソッドの制約と考えることができます。
それで、注文はどこで行われますか?
そして答えは最後のパターンです:
quicksort (p:xs) = (quicksort lesser) ++ [p] ++ (quicksort greater)
where
lesser = filter (< p) xs
greater = filter (>= p) xs
実行時に、プログラムは配列を取得しようとしており、配列は次の 2 つのパターンのいずれかを満たす必要があります。
パターン 1#: 空の場合、関数は同じ空の配列を返し、停止します。
パターン 2#: 空でない、つまりp
末尾の配列に先頭要素が追加されているxs
。そのような場合、関数はp
中央に配置され、 のすべての要素がの左側 ( で定義されているように)xs
より小さく、 のすべての要素がの右側に配置されます。さらに、関数は最終的にそれ自体 (つまり、同じ関数) を(上で定義したように の左側の配列) および(上で定義したように右側の配列) に適用するように指示されます。側面p
lesser
p
xs
p
p
quicksort
lesser
p
greater
p
)。ご覧のとおり、サイズがゼロの配列が残り、パターン 1# が関数を終了するまで、これが続きます。
最後に、これらの再帰呼び出しが終了するたびに、関数は配列を返します。
sortedlesser ++ p ++ sortedgreater
ここで、 は on をsortedlesser
適用した結果の配列であり、 はquicksort
onlesser
を適用しsortedgreater
た結果の配列です。quicksort
greater
ちょっと待って…pを何度も複製していませんか?
'greater' 述語は項目 '>= p' (ピボット) を定義するので、'++ [p ]' アイテム?
いいえ、これはパターン マッチングの仕組みではありません。その内のすべての要素xs
が以上であると言っていp
ます。定義上p
、それ自体は から外れていxs
ます。p
inの重複がある場合xs
、それらは右側に配置されます。この選択により、元の配列の自然な順序が維持されることに注意してください。