2013-03-23 48 views
0

我是新來的Ruby和有關的排序方法數組排序{| x,y | },x總是小一點?

例如很困惑:

person.sort{|x, y| x.age<=> y.age} 

我知道,如果我將其更改爲y.age<=> x.age,這將扭轉排序順序。

我閱讀本other question和他們都只能說xy是從陣列的兩個元件,由sort算法選擇。

但是x總是較小的對象?我的意思是,如果我把它寫成第一種方式,它會不會從最小的到最古老的?

感謝

+0

哈哈是啊,那些答案是好的,但他們都沒有說明是否'x'是較小或較大 – hrsetyono 2013-03-23 06:50:04

+2

但我不明白爲什麼接受的答案在副本中也不回答這個問題。你熟悉'<=>'運營商嗎? – JJJ 2013-03-23 06:50:04

+0

從我在這個問題中讀到的內容來看,如果'x hrsetyono 2013-03-23 06:54:42

回答

2

這是對正在發生的事情的簡化,不是 Ruby使用的排序算法(希望),但它可能有助於理解發生了什麼。

比方說,你有這個數組要排序年齡:

[15, 25, 12] 

現在排序算法開始經歷的陣列,以確定正確的順序。首先,它採前兩個元素並對它們進行比較:

|15, 25| 15 <=> 25 

結果是-1,所以現在它知道15應該被排序它需要之前25.

下一頁25和12

|25, 12| 25 <=> 12 

結果是1.12應該在25之前排序。

現在我們知道,25應該在每隔一個元素之後排序。我們只需要知道訂單15和12

之間

|15, 12| 15 <=> 12 
結果是1,那麼12應15。現在最後的排序被稱爲前進行排序:

[12, 15, 25] 

正如你看到的,比較算法被多次調用。 xy|x, y|是傳遞給比較方法的數組元素的佔位符。

+0

非常感謝。我從來沒有想過它實際上跑了好幾次 – hrsetyono 2013-03-23 07:13:58

2

這裏有一個方法,你可以回答自己這個問題,用reductio ad absurdum一種形式:如果x總是較小的對象?如果是這樣的話,那麼你就不需要費心去比較它與y,你會嗎?你可以只寫:

person.sort { |x, y| 1 } 

或者,也許我有倒退,你可以只寫:

person.sort { |x, y| -1 } 

但無論哪種方式,這是一種荒謬的,不是嗎?當然,如果你嘗試它,它將無法正常工作。

因此,這告訴我們在這種塊的主體中​​,我們不知道x還是y是較小的對象。實際上,xy可以是來自person陣列的任意兩個任意元素。這就是我們必須寫出比較的全部原因。

這是否有助於澄清它,還是我誤解了你的問題?

+0

是的,你理解這個問題。所以,當我們寫'x.age <=> y.age'時,我們不知道它是從最小的到最老的還是從最老的到最小的? – hrsetyono 2013-03-23 06:58:16

+1

否。在這種情況下,它從最大到最老排序,因爲如果「x.age」是12,「y.age」是15,它將確定12應該在15之前排序。 – JJJ 2013-03-23 06:59:53

+0

但是當我們運行它,我們不知道'x'是否會小於15?它可以是25,它會將數組從最老到最小。 – hrsetyono 2013-03-23 07:03:36

相關問題