2016-08-07 3 views
1

私は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に、< pivotrightに入れて、配列を分割します。 Return pivotを検索し、クイックソートをleftrightアレイに再帰的に呼び出します。

私が理解していないのは、最終アレイの構成方法です。返された数字に適切なインデックスが割り当てられる場所はわかりません。 pivotが返されたときに発生しますか?それはどのようにして正しい指数になるのでしょうか?

私の混乱の一部は、再帰についての理解の欠如から来ていると思います。

ご協力いただきありがとうございます。

答えて

1

値リストでreturnを呼び出すと、Rubyはリストを配列に変換して配列を返します。

def return_array 
    return 1, 2 
end 
return_array 
#=> [1, 2] 

これはスプラット演算子「*」を有する要素のリストに配列を回すArray to Arguments Conversion、と組み合わせて使用​​することができます。

a = [1, 2] 
def add(c, d) 
    c + d 
end 
add(*a) 
#=> 3 

クイックソート方法でreturn文は、このトリックを行い、それがピボット未満だすべての要素である、左の

  1. スプラットクイックソート結果でリストを返します(pivot.method(:>).call(elem)、すなわち、pivot > elem
  2. ピボット
  3. すべてある右のスプラットクイックソート結果ピボットより大きいか等しい要素! (pivot > elem)

そしてRubyはそれらを配列に変換して返します。

+0

AHA!私はどこが間違っているのか分かります。左はピボットよりも小さい値を取得します!私は左右を逆転させた。今は完璧な意味合いがあります。ピボットは、リスト内のどこにあるか、他のすべてに対して相対的な正しい位置にとどまり、すべての数字が正しい位置にフィルタリングされるまで、左と右が再帰的にソートされます。並べ替えられたリストが配列として返されます。 – TheStrabusiness

関連する問題