文字列を降順にソートする

どうやるんだっけ? と思って直ぐに思いつかなった。

str = %w(9 7 5 8 4 6 1 3 2)

# 昇順
p str.sort

# 降順
p str.sort{|a, b| -(a <=> b)}

「数値じゃないとマイナス付けられない!」とか思い始めると、割とハマるようです。
計算量が気になるので、sort_byでスマートにやる方法があるといいな。

追記

教えてもらいました。ありがとうございます。

irb(main):001:0> str = %w(9 7 5 8 4 6 1 3 2)
=> ["9", "7", "5", "8", "4", "6", "1", "3", "2"]
irb(main):002:0> str.sort.reverse
=> ["9", "8", "7", "6", "5", "4", "3", "2", "1"]
irb(main):003:0> str.sort {|a, b| b <=> a }
=> ["9", "8", "7", "6", "5", "4", "3", "2", "1"]

こっちのがいいですね。

追記2

ベンチマーク取ってみた。
reverseが圧倒的に速い。

#!/usr/bin/ruby
require 'benchmark'

array = Array.new
100000.times { array << rand(100000).to_s }

puts Benchmark::CAPTION
puts Benchmark.measure { array.sort{|a, b| -(a <=> b)} }
puts Benchmark.measure { array.sort{|a, b| b <=> a} }
puts Benchmark.measure { array.sort.reverse }
      user     system      total        real
  1.810000   1.600000   3.410000 (  3.412642)
  1.780000   1.680000   3.460000 (  3.455054)
  0.120000   0.000000   0.120000 (  0.122285)

      user     system      total        real
  1.940000   1.800000   3.740000 (  3.731432)
  2.140000   1.490000   3.630000 (  3.637516)
  0.130000   0.000000   0.130000 (  0.123693)

      user     system      total        real
  2.030000   1.630000   3.660000 (  3.665698)
  1.790000   1.680000   3.470000 (  3.471341)
  0.140000   0.000000   0.140000 (  0.133935)