我只是想了解Ruby的排序功能和塊,我想出了下面的代碼:理解排序方法和紅寶石
a = [1,2,3]
a.sort do |x,y|
x
end
不會返回x
採取作爲排序這兩個要素的因素?我期待以下行爲:
1,2
作爲塊參數傳遞,返回1
。2,3
作爲塊參數傳遞,返回2
。1,3
作爲塊參數傳遞,返回3
。
因此,考慮到返回的值,不會排序的數組仍然是[1,2,3]
?我在哪裏弄錯了?
我只是想了解Ruby的排序功能和塊,我想出了下面的代碼:理解排序方法和紅寶石
a = [1,2,3]
a.sort do |x,y|
x
end
不會返回x
採取作爲排序這兩個要素的因素?我期待以下行爲:
1,2
作爲塊參數傳遞,返回1
。2,3
作爲塊參數傳遞,返回2
。1,3
作爲塊參數傳遞,返回3
。因此,考慮到返回的值,不會排序的數組仍然是[1,2,3]
?我在哪裏弄錯了?
該區塊needs to return-1
,0
或1
。我不相信對價值傳遞的順序有任何保證。由於您沒有遵守您的返回值的合同,因此結果未定義。
在現實中,我相信發生的事情是,您總是返回一個正值,所以第二個(後面的數組)值總是向前移動。但是,根據文件,這還不能保證。
這種行爲或多或少就像你的描述:
a = [1,2,3]
a.sort do |x,y|
x <=> y
end
是否有任何嚴格的路徑x,y值以什麼順序傳遞給塊?當我使用像[1,2,3,4,5]這樣的更大的數組時,x,y的順序是(1,3),(3,5),(2,3),(4,3),( 2,4),(4,1) – nik7 2012-08-06 06:40:35
@nlingutla該文檔沒有指定訂單,所以我不認爲它是安全的依靠任何特定的訂單。不同的實現(以及相同實現的未來版本)可能會使用不同的算法。 – 2012-08-06 06:49:57
有趣......我檢查了我的系統(運行Ruby 1.9.3)進行比較的順序,它們與@nlingutla有點不同。看起來最多有4個元素,使用了一個使用固定比較序列的專用分類函數。之後,它似乎在使用快速排序。我沒有檢查翻譯的來源 - 我只是從觀察比較完成的順序來猜測。 – 2012-08-06 07:25:40
有從塊作爲排序因素使用的返回值的另一種方法,這就是所謂的'sort_by'。 – 2012-08-06 07:42:09