我刚开始编写排序算法。 目前,我正在学习冒泡排序算法,我在网上找到了以下内容,并且运行良好:
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 ]
我在这里做什么错了?
答案 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