2017-08-04 70 views
0

我寫了一個函數來執行wave-sort,如下所示。結果數組應該以比下一個更大的數字開始,但是我的代碼沒有這樣做。例如,如果輸入是:使用Javascript進行波形整理

[73, 80, 40, 86, 14, 96, 10, 56, 61, 84, 82, 36, 85] 

...它給出的

[ 86, 96, 84, 85, 80, 82, 61, 73, 40, 56, 14, 36, 10 ] 

代替的輸出開始比下一個更大的數,這是96

function waveSort(arr){ 
    arr = arr.sort(function(a, b) { 
     return b - a; 
    }); 

    for (var i = 1; i < arr.length; i += 2) { 
     if (arr[i-1] > arr[i]) { 
      var temp = arr[i]; 
      arr[i] = arr[i-1]; 
      arr[i-1] = temp; 
     } 
     if (i+1 < arr.length && arr[i+1] > arr[i]) { 
      temp = arr[i]; 
      arr[i] = arr[i+1]; 
      arr[i+1] = temp; 
     } 
    } 
    return arr; 
} 
+0

爲什麼你認爲它應該從更大的價值開始?事實上,你在第一個「if」中測試,如果真的,則在較大的值之前交換較小的值。你期望什麼? – trincot

+0

有沒有更好的解決方案波濤? – Hoslack

回答

2

您已經明確地設計了您的函數以較低的值開始。

在第一if你檢測的情況下的第一個值大於第二個,如果是這樣,你換他們(當i = 1):

if (arr[i-1] > arr[i]) { 

所以這是正常的,你結束了一個在索引0小的值比指數1

如果你希望你的陣列開始一個「波高」,然後更改條件,你的兩個if S:

function waveSort(arr){ 
 
    arr = arr.sort(function(a, b) { 
 
     return b - a; 
 
    }); 
 

 
    for (var i = 1; i < arr.length; i += 2) { 
 
     if (arr[i-1] < arr[i]) { 
 
      var temp = arr[i]; 
 
      arr[i] = arr[i-1]; 
 
      arr[i-1] = temp; 
 
     } 
 
     if (i+1 < arr.length && arr[i+1] < arr[i]) { 
 
      temp = arr[i]; 
 
      arr[i] = arr[i+1]; 
 
      arr[i+1] = temp; 
 
     } 
 
    } 
 
    return arr; 
 
} 
 

 
var waved = waveSort([73, 80, 40, 86, 14, 96, 10, 56, 61, 84, 82, 36, 85]); 
 
console.log(JSON.stringify(waved));

+0

非常感謝。有用。 – Hoslack