带for循环的冒泡排序未按预期工作

时间:2019-06-21 10:25:06

标签: javascript sorting bubble-sort

我刚开始编写排序算法。 目前,我正在学习冒泡排序算法,我在网上找到了以下内容,并且运行良好:

const arr = [3, 2, 6, 9, 3, 5];

const bubbleSort = array => {
  do {
    var isSorted = true;
    for (var i = 0; i < array.length; i++) {
      if (array[i] > array[i + 1]) {
        var temp = array[i];
        array[i] = array[i + 1];
        array[i + 1] = temp;
        isSorted = false;
      }
    }
  } while(!isSorted)
  return array
};

输出:

[ 2, 3, 3, 5, 6, 9 ]

但是,当我尝试使用if语句而不是如下所示的while循环编写它时,它无法按预期工作:

const arr = [3, 2, 6, 9, 3, 5];

const bubbleSort = (array) => {
  let isSorted = false;
  if(!isSorted) {
    isSorted = true;
    for(var i = 0; i < array.length; i++) {
      if (array[i] > array[i + 1]) {
        var temp = array[i + 1];
        array[i + 1] = array[i];
        array[i] = temp;
        isSorted = false;
      }
    }
  }
  return array;
}

输出:

[ 2, 3, 6, 3, 5, 9 ]

我在这里做什么错了?

2 个答案:

答案 0 :(得分:1)

我们需要while循环来进行冒泡排序。

如果我们删除while,那么我们将在整个数组中仅“冒泡”一次。例如,如果

[3, 2, 6, 9, 3, 5];

这里3(第一个元素)大于2(第二个元素),所以我们交换它们,现在我们有了

[2, 3, 6, 9, 3, 5]

当我们继续使用for循环时,我们接近较小的3(第6个元素),因此将其交换为9(第5个元素)。并继续前进。

[2, 3, 6, 3, 9, 5]

从这里开始,但是我们可以分析情况。我们可以看到3(第4个元素)小于6(第3个元素),但是for循环在前面,因此我们不会处于将其与较大的元素交换的情况。 因此,我们必须从头开始再次“冒泡”,我们需要这样做直到一切都整理好为止。当没有要交换的内容时,会发生这种情况,因为我们在交换时都会设置isSorted=false。在对数组进行排序后,我们将进行最后一遍检查所有相邻对,如果它们都已排序,则不会发生交换,并且isSorted将是true

TLDR;我们需要while,因为“冒泡”可能需要多次通过数组。

答案 1 :(得分:0)

while循环是实现冒泡排序的一种简便方法,否则,您将需要带有嵌套for循环的O(n²)算法,if else语句将不起作用:

const arr = [3, 2, 6, 9, 3, 5];
const bubbleSort = array => {
    var length = array.length;
    //Number of passes
    for (var i = 0; i < length; i++) { 
        //Notice that j < (length - i)
        for (var j = 0; j < (length - i - 1); j++) { 
            //Compare the adjacent positions
            if(array[j] > array[j+1]) {
                //Swap the numbers
                var tmp = array[j];  //Temporary variable to hold the current number
                array[j] = array[j+1]; //Replace current number with adjacent number
                array[j+1] = tmp; //Replace adjacent number with current number
            }
        }        
    }
    return array
}
bubbleSort(arr)
// expected output: [2, 3, 3, 5, 6, 9]

您还可以在此处查看冒泡排序伪代码:Bubble Sort Algorithm