私はRubyでいくつかのsoringアルゴリズムを学習し、クイックソートのこの再帰的な実装を学んだ:このRubyクイックソルト実装で最終的な配列はどのように構築されますか?
class Array
def quicksort
return [] if empty?
pivot = delete_at(rand(size))
left, right = partition(&pivot.method(:>))
return *left.quicksort, pivot, *right.quicksort
end
end
array = [5,3,2,18,1,6,4,7,5,9,0]
p array
#=> [5, 3, 2, 18, 1, 6, 4, 7, 5, 9, 0]
p array.quicksort
#=> [0, 1, 2, 3, 4, 5, 5, 6, 7, 9, 18]
私は私がここで何が起こっているかを基本的に理解すると思います。私はこの権利を持っていますか?
任意のピボットを選択して番号を格納し、そのインデックスを配列から削除します。配列を配列left
に、< pivot
をright
に入れて、配列を分割します。 Return pivot
を検索し、クイックソートをleft
とright
アレイに再帰的に呼び出します。
私が理解していないのは、最終アレイの構成方法です。返された数字に適切なインデックスが割り当てられる場所はわかりません。 pivot
が返されたときに発生しますか?それはどのようにして正しい指数になるのでしょうか?
私の混乱の一部は、再帰についての理解の欠如から来ていると思います。
ご協力いただきありがとうございます。
AHA!私はどこが間違っているのか分かります。左はピボットよりも小さい値を取得します!私は左右を逆転させた。今は完璧な意味合いがあります。ピボットは、リスト内のどこにあるか、他のすべてに対して相対的な正しい位置にとどまり、すべての数字が正しい位置にフィルタリングされるまで、左と右が再帰的にソートされます。並べ替えられたリストが配列として返されます。 – TheStrabusiness