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 の重複も消せそう。