Ruby でクイックソート 2回目
コメントで partition を教えてもらたので使ってみました。
[ソース]
# 偶数と奇数に分割 evens, odds = (1..10).partition { |n| n % 2 == 0 } p evens p odds def quick_sort(seq) if seq == [] return [] end x = seq.first xs = seq[1..seq.size] left, right = xs.partition { |a| a < x } quick_sort(left) + [x] + quick_sort(right) end source = (1..10).sort_by{rand} p source p quick_sort source
[出力]
[2, 4, 6, 8, 10] [1, 3, 5, 7, 9] [10, 2, 5, 8, 9, 6, 7, 3, 1, 4] [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
ちょっとすっきりとしましたね。
map を使えば quick_sort の重複も消せそう。