def qsort(arr) return arr if arr.size<2 small=arr.reject{|i| i>=arr[0]} large=arr.reject{|i| i<=arr[0]} qsort(small) + arr.reject{|i| i!=arr[0]} + qsort(large) end
这里用了 3 趟遍历实现 partition,仅仅是为了读起来容易。 但完全可以用一趟实现 partition,但感觉代码略丑。
有没有更好的实现?
Enumerable#group_by & <=>
Enumerable#group_by
<=>
def qsort(a) return [] if not a or a.size<1 nxt=a.group_by{|i| i<=>a[0]} qsort(nxt[-1])+nxt[0]+qsort(nxt[1]) end
@msg7086 这样确实更好,但感觉我的写法还不是最好的。