2016-04-25 166 views
-1
var array = [5,3,4,1] 

for(var x = 0; x < array.length; x++){ 

    for(var y = array.length - 1; y >= x; y--){ 

     if(array[x] > array[y]){ 
      var temp = array[y]; 
      array[y] = array[x]; 
      array[x] = temp; 
    } 
    } 
} 
console.log(array); 

//Output : [1,3,4,5] 

我知道循環是用來交換循環的,如果x大於y,它們實質上是交換兩個值。第一次迭代循環後執行停止

[1,3,4,5]是x = 0時的結果,但是爲什麼一旦x = 1沒有任何變化,依此類推?不應該通過迭代運行次級for循環,並繼續交換值直到第一次循環達到array.length(4)?

編輯:有關我的思維過程在哪裏的更多信息: 第一次迭代後輸出爲[1,3,4,5],但迭代到x = 1時又如何?那時,x [1] = 3,對嗎?當y從5遞減到4到3,但是3> 1時,if語句失敗,所以我認爲輸出變爲[3,1,4,5]。在這一點上,x重複到x [2],它是4,輸出變爲[4,3,1,5],最後x [3] = 5,在這裏沒有進一步的交換可能

+1

是什麼讓你覺得它並沒有一直在運行? (在這個特定的例子中,它不必因爲數組在第一次迭代中被排序...) – Terminus

+0

我的錯誤。我知道它一直在運行,我只是不明白爲什麼在第一次迭代後沒有任何變化。 – 87born

+0

沒有任何變化,因爲沒有通過if語句。通讀一些關於編程的教程,這種事情將會在那裏提前。 – Terminus

回答

-1

不明白是什麼你意味着進程停止。以下是您的代碼

var array = [5,3,4,1] 
var count = 0, swap = 0; 
for(var x = 0; x < array.length; x++){ 
    for(var y = array.length - 1; y >= x; y--){ 
     count++; 
     if(array[x] > array[y]){ 
      swap++; 
      var temp = array[y]; 
      array[y] = array[x]; 
      array[x] = temp; 
    } 
    } 
} 
console.log('count', count, 'swap', swap,'array',array); 

計數10交換1個陣列的修改版本[1,3,4,5]

的代碼是一個簡單交換排序算法從最小到最大。第一次交換之後,數組完全排序,因此不會再發生交換。循環確實跑了10次。

+0

我很抱歉如此密集,但爲什麼沒有進一步的交換?在第一次迭代之後輸出是[1,3,4,5],但是當它迭代到x = 1時呢?那時,x [1] = 3,對嗎?當y從5遞減到4到3,但是3> 1時,if語句失敗,所以我認爲輸出變爲[3,1,4,5]。在這一點上,x迭代到x [2],它是4並且輸出變成[4,3,1,5],最後x [3] = 5,這裏不可能進一步交換。 – 87born

+0

當x = 1時,y = {3,2,1}(不是{3,2,1,0})和數組[y] = {5,4,3}(同樣,不是{5,4,3 ,1},因爲當y

0
var array = [5,3,4,1] 
for(var x = 0; x < array.length; x++){ 
    for(var y = array.length - 1; y >= x; y--){ 
      console.log("condition="+(array[x] > array[y])); 
     if(array[x] > array[y]){ 
      var temp = array[y]; 
      array[y] = array[x]; 
      array[x] = temp; 
    } 
    } 
} 
console.log(array); 

如果你看一下上面的你正在嘗試做的是基於交換的條件array[x] > array[y].值的代碼這意味着,只要你的條件爲真,那麼只有值將被交換。這段代碼將總共有10次迭代。您的條件將在此特定代碼中評估10次。而在這十次中,這隻會是真實的。休息九次它將被評估爲假。所以交換邏輯不會被執行九次,因此你會得到輸出爲[1, 3, 4, 5],就像你在第一次迭代之後提到的那樣。在上面的代碼中,我已經把console.log("condition="+(array[x] > array[y]));這將幫助你瞭解當你的條件評估爲真,並交換髮生。