2013-09-27 125 views
0

所以我明白,給定一個數組,您可以使用自定義比較函數對其進行排序。使用比較函數排序

因此,像在Javascript以下內容:

var arr = [5,4,3,6,7,2]; 
arr.sort(function(a,b){ 
    if (a < b) 
     return -1; 
    else if (a > b) 
     return 1; 
    else 
     return 0; 
}); 

所以,我的朋友說,我並不需要返回0排序列表中的這個場景。此外,他說我們可以從[true,false]返回,而不是從[-1,0,1]返回。真的嗎? 我試圖找到他的主張的反例,但我不能。我無法想象使用他的代碼不能正確排序數組的情況。

這裏的例子,我的朋友給:

var arr = [5, 4, 3, 6, 7, 2]; 
arr.sort(function(a, b) { 
    return a > b; 
}); 

它是很好的做法,從一系列的[-1,0,1]回報?什麼是整數可比較的必要性?我注意到,這是跨越多種編程語言的情況,而不僅僅是JavaScript。像C中的這個例子一樣。

+0

'});'(兩次!)看起來不對。 – wildplasser

+1

根據文檔,你的朋友是錯的。請參閱https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort – Phil

+1

請注意,它們不一定只是'[-1,0,1]',它們可以是任何負值,0或任何正值。這允許你做'返回a - b;'。 – Barmar

回答

1

告訴你的朋友他們肯定是錯的。

[0, 0, 0, -1, -1, -1, 2, 2, 2, 7, 6, 5, 4, 3].sort(function(a, b) { return a > b }) 

-> [2, 0, 0, -1, -1, -1, 0, 2, 2, 3, 4, 5, 6, 7] 
+0

真棒給一個反例,謝謝! –

1

不,這是不好的做法,你應該遵循語言規範,它說,比較函數應該返回正值時,第一個元素是大於第二個,負值時的第一要素低於第二個,如果它們相等,則爲0。

你在做什麼可能在某些實現中工作,但不會移植。返回truefalse可能會導致它們分別被強制爲10。有些排序算法只需要知道元素A是否大於元素B(例如,Common Lisp語言指定它的SORT函數採用布爾比較函數,所以顯然需要實現使用這種算法),所以可以獲得期望的結果。但是如果實現取決於三態邏輯,則它將不起作用 - 返回false0將使其認爲這些元素是等同的,並且可能不會正確排序它們。