2012-11-29 25 views
1

你知道一個更好,更快,更聰明,更有效率或更elegat做以下的方式嗎?你能用Ruby優化這個降序排序數組嗎?

由於這陣

a = [171, 209, 3808, "723", "288", "6", "5", 27, "22", 207, 473, "256", 67, 1536] 

得到這個

a.map{|i|i.to_i}.sort{|a,b|b<=>a} 
=> [3808, 1536, 723, 473, 288, 256, 209, 207, 171, 67, 27, 22, 6, 5] 

回答

2

您可以使用就地突變,以避免產生新的陣列:

a.map!(&:to_i).sort!.reverse! 

很難知道它的速度更快或儘管沒有基準,但效率更高。

+0

酷!這真的有效,但讓我看看,只是有一段時間,如果別人有其他想法... –

+1

請注意,這是一個原地變異,所以它修改*原始*數組。這對RAM很有用,但如果該數組在該範圍之外的任何位置使用,則可能會產生副作用。 –

+0

是的,我看到了...... –

2

下面是一個使用symbol#to_proc

a.map(&:to_i).sort.reverse 

這比使用就地改性劑(!)方法快,但佔用更多的內存。作爲獎勵,如果您想對其進行任何操作,它會保持原始數組a不變。

+0

...令人印象深刻! –

+0

@edgerunner - 是什麼讓它比就地更快?如果有的話,我希望額外的分配,使非變異的方法稍微慢一點(雖然不足以注意)。 –

+0

@ChrisHeald,我記得讀過ruby在內部使用合併排序和就地合併排序算法。看到[比較](http://en.wikipedia.org/wiki/Sorting_algorithm#Comparison_of_algorithms) – edgerunner