2012-08-06 108 views
1
一般塊

我只是想了解Ruby的排序功能和塊,我想出了下面的代碼:理解排序方法和紅寶石

a = [1,2,3] 
a.sort do |x,y| 
    x 
end 

不會返回x採取作爲排序這兩個要素的因素?我期待以下行爲:

  1. 1,2作爲塊參數傳遞,返回1
  2. 2,3作爲塊參數傳遞,返回2
  3. 1,3作爲塊參數傳遞,返回3

因此,考慮到返回的值,不會排序的數組仍然是[1,2,3]?我在哪裏弄錯了?

+0

有從塊作爲排序因素使用的返回值的另一種方法,這就是所謂的'sort_by'。 – 2012-08-06 07:42:09

回答

7

該區塊needs to return-101。我不相信對價值傳遞的順序有任何保證。由於您沒有遵守您的返回值的合同,因此結果未定義。

在現實中,我相信發生的事情是,您總是返回一個正值,所以第二個(後面的數組)值總是向前移動。但是,根據文件,這還不能保證。

這種行爲或多或少就像你的描述:

a = [1,2,3] 
a.sort do |x,y| 
    x <=> y 
end 
+0

是否有任何嚴格的路徑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

+1

@nlingutla該文檔沒有指定訂單,所以我不認爲它是安全的依靠任何特定的訂單。不同的實現(以及相同實現的未來版本)可能會使用不同的算法。 – 2012-08-06 06:49:57

+0

有趣......我檢查了我的系統(運行Ruby 1.9.3)進行比較的順序,它們與@nlingutla有點不同。看起來最多有4個元素,使用了一個使用固定比較序列的專用分類函數。之後,它似乎在使用快速排序。我沒有檢查翻譯的來源 - 我只是從觀察比較完成的順序來猜測。 – 2012-08-06 07:25:40