2009-09-29 45 views
54

下面的代碼如何將這個數組按照數字順序排序?Javascript的sort()是如何工作的?

var array=[25, 8, 7, 41] 

array.sort(function(a,b) { 
    return a - b}) 

我知道,如果計算的結果是...

比0減:「一」排序比「B」更低的指數。
零:「a」和「b」被認爲是相等的,並且不執行排序。
大於0:「b」被排序爲比「a」更低的索引。

在排序過程中多次調用數組排序回調函數嗎?

如果是這樣,我想知道哪些兩個數字每次都傳入函數。 (a)和8(b),接着是「7」(a)和「41」(b),所以:

25(a)-8(b) = 17(大於零,因此將「b」排序爲比「a」低的索引):8,25

7(a)-41(b)= -34(小於零,因此排序「一個」比低指數‘b’:?!7,41

如何將兩組數字則相對排序,以彼此

請幫助陷入困境的新手

+1

我希望這會造成一些亂碼! – cw84 2009-09-29 20:22:10

回答

32

在排序過程中多次調用數組排序回調函數嗎?

如果是這樣,我想知道這兩個數字是每次

你可以找到你的自我與傳遞給函數:

array.sort((a,b) => { 
    console.log(`comparing ${a},${b}`); 
    return a > b ? 1 
       : a === b ? 0 
         : -1; 
}); 

E DIT

這是輸出我有:值的

25,8 
25,7 
8,7 
25,41 
+7

寧願做一個console.log到firebug或html DIV元素的.innerHTML + =「比較」+ a +「,」+ b +「\ n」; – Joshua 2009-09-29 20:32:21

+0

@Joshua:肯定 – OscarRyz 2009-09-29 20:36:27

+2

請記住,這是一個類似wiki的網站,我們可以編輯其他答案,使它們更好:) – 2011-07-09 23:29:52

3

是陣列在排序過程中多次調用回調函數嗎?

是的,就是這樣。回調函數用於根據需要比較數組中的元素對,以確定它們的順序。比較函數的實現在處理數字排序時不是非典型的。詳細信息在the specsome其他more readable網站。

34

JavaScript解釋器內置了一些sort algorithm實現。它在排序操作中調用比較函數一些次數。比較函數被調用的次數取決於特定的算法,要排序的數據以及它在排序之前的順序。

某些排序算法在已排序的列表上表現不佳,因爲它使得它們比通常情況下做出了更多的比較。其他人可以很好地處理預先排序的清單,但在其他情況下,他們可能會被「欺騙」成績不佳。

有許多常用的排序算法,因爲沒有單一的算法是完美的所有目的。最常用於通用分類的兩種是Quicksortmerge sort。快速排序通常是兩者中較快的,但合併排序有一些很好的屬性,可以使它成爲更好的整體選擇。合併排序是stable,而Quicksort不是。兩種算法都是可並行化的,但合併排序的工作方式使得並行實現更高效,其他方面均相同。

您的特定JavaScript解釋器可能會使用其中一種算法或其他算法。 ECMAScript標準does not specify which algorithm符合實施必須使用。它甚至明確表示不需要穩定。

+1

FWIW,基本的Quicksort是可以「欺騙」執行不佳的算法之一。在簡單的形式中,它對於已經排序或完全顛倒的列表具有O(N^2)性能。大多數庫Quicksort算法有一些非明顯的優化,這有助於避免這些常見的最壞情況。 – Adisak 2009-09-29 20:42:18

+2

JavaScriptCore實際上使用AVL樹進行排序,因爲它需要在修改要排序的數組的比較器函數中確定性地運行。 – olliej 2009-09-30 02:14:44

9

對被比較,一次一對。被比較的對是一個實現細節 - 不要以爲它們在每個瀏覽器上都是一樣的。回調可以是任何東西(所以你可以排序字符串或羅馬數字或其他任何你可以想出返回1,0,-1的函數)。

有一點需要記住,JavaScript的排序方式是它不能保證穩定。

2

數組排序回調函數在排序過程中被多次調用嗎?

由於這是一個比較排序,給出N項,回調函數應該在平均值(N *了Lg N)次調用一個快速有點像Quicksort。如果使用的算法類似於Bubble Sort,那麼平均(N * N)次調用回調函數。

比較排序的最小調用次數是(N-1),僅用於檢測已排序的列表(即,如果沒有交換髮生,則在Bubble Sort中提前清除)。

相關問題