2016-06-14 40 views
1

我用JS做了一個氣泡排序算法(sorta)。它有時會起作用,但問題是它只能遍歷數組一次。這裏是我的代碼:Javascript:Bubble Sort

function bubble(arr) { 
    for (var i = 0; i < arr.length; i++) { 
    if (arr[i] > arr[i + 1]) { 
     var a = arr[i] 
     var b = arr[i + 1] 
     arr[i] = b 
     arr[i + 1] = a 
    } 
    } 
    return arr; 
} 
+2

你認爲如何讓它再次穿過陣列?應該在什麼條件下停止? –

+0

這就是我遇到的麻煩:( –

+0

請參考[Wikipedia中的僞代碼實現](https://en.wikipedia.org/wiki/Bubble_sort):你需要不斷循環直到滿足條件(不交換髮生)在JavaScript中,這可能意味着代碼頂部有一個很大的'while()'。 –

回答

0

你需要一個內環以正確完成排序:

function bubble(arr) { 
 
     var len = arr.length; 
 
    
 
     for (var i = 0; i < len ; i++) { 
 
     for(var j = 0 ; j < len - i - 1; j++){ // this was missing 
 
     if (arr[j] > arr[j + 1]) { 
 
      // swap 
 
      var temp = arr[j]; 
 
      arr[j] = arr[j+1]; 
 
      arr[j + 1] = temp; 
 
     } 
 
     } 
 
     } 
 
     return arr; 
 
    } 
 

 
document.write(bubble([1,9,2,3,7,6,4,5,5]));

+0

請解釋內部循環,它爲什麼需要? –

1

請看看下面的順序:

[5, 4, 3, 2, 1] 

現在讓我們說你需要使用bubbl以升序排序e排序。

因此,您迭代數組並交換相鄰的元素,否則將進行排序。

這裏是迭代

[4, 3, 2, 1, 5] 

完成後,你會得到什麼現在,如果你這樣做另一次,你會得到這樣的:

[3, 2, 1, 4, 5] 

同樣的,你需要重複迭代次數足以讓它完全排序。這意味着你需要2個嵌套循環。內循環是迭代數組,外循環是重複迭代。

請參閱this文章的分步示例。

1

我的冒泡排序只是一個while循環:

function bubbleSort(arr){ 
    var sorted = false 
    while (!sorted){ 
    sorted = true; 
    arr.forEach(function (element, index, array){ 
     if (element > array[index+1]) { 
     array[index] = array[index+1]; 
     array[index+1] = element; 
     sorted = false; 
     } 
    }); 
    } 
} 
0
function bubble(arr) {//You need Two Loops for Bubble sort 
    for (var i = 0; i < arr.length; i++) {//Outer Loop 
    for(var j=0; j < arr.length - 1; j++){//Inner Loop 
    if (arr[j] > arr[j + 1]) { 
     var a = arr[j] 
     var b = arr[j + 1] 
     arr[j] = b 
     arr[j + 1] = a 
    } 
    } 
    } 
    return arr; 
} 
0

冒泡排序的另一種形式包括啓動在陣列的端部與第一放置最小元素和下去,直到最大的。這是代碼:

function bubbleSort(items) { 
    var length = items.length; 
    for (var i = (length - 1); i >= 0; i--) { 
     //Number of passes 
     for (var j = (length - i); j > 0; j--) { 
      //Compare the adjacent positions 
      if (items[j] < items[j - 1]) { 
       //Swap the numbers 
       var tmp = items[j]; 
       items[j] = items[j - 1]; 
       items[j - 1] = tmp; 
      } 
     } 
    } 
} 

注意冒泡排序是最慢的排序算法之一。