class Array
def sort_by
self.map {|i| [yield(i), i] }.
sort {|a, b| a[0] <=> b[0] }.
map {|i| i[1]}
end
end

Ruby のsort_by は、[ブロック評価結果, データ]の配列をmap で作ってから、
ソートして、オリジナルデータのみを抜き出して、mapで配列にする

これは、シュウォーツ変換と言って、比較回数を減らす