2016-06-14 105 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; 
      } 
     } 
    } 
} 

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