JavaScript 冒泡排序修改(循环 `i` 在排序结束前停止。)
JavaScript bubble sort modification (Looping `i` stops before the sorting ends.)
这是我的第一个问题。我在研究JS中冒泡排序的实现
代码似乎无法正常工作。
请帮我解决一下
var arr = [11, 12, 0, 1, 2, 4, 3, 5, 6, 7, 8, 9, 10, 13];
var n = arr.length;
var t;
var swap = true;
for (var i = 0; (i < n) && (swap === true); i++) {
for (var j = 0; j < (n - (i + 1)); j++) {
if (arr[j] > arr[j + 1]) {
t = arr[j + 1];
arr[j + 1] = arr[j];
arr[j] = t;
swap = true;
} else {
swap = false;
}
}
};
var swap = true;
for (var i = 0; (i < n) && (swap === true); ++i) {
swap = false;
for (var j = 0; j < ( n - (i + 1) ); ++j) {
if ( arr[j] > arr[j + 1] ) {
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
swap = true;
}
}
}
一旦loopi没有交换任何数字,"swap"将为假,然后我们可以退出循环。
循环不知道数组何时排序,因此您不可能知道何时停止 i
循环。
如果你想让冒泡排序起作用,你应该把swap
变量逻辑去掉。
var arr = [11, 12, 0, 1, 2, 4, 3, 5, 6, 7, 8, 9, 10, 13];
var n = arr.length;
var t;
var swap = true;
for (var i = 0; i < n; i++) {
for (var j = 0; j < n; j++) {
if (arr[j] > arr[j + 1]) {
t = arr[j + 1];
arr[j + 1] = arr[j];
arr[j] = t;
}
}
};
但是完成冒泡排序的更好方法是 this。
如果你想提前中断外循环,你可以使用 Javascript 中的标签来实现。
outer:
for (var i = 0; i < n; i++) {
inner:
for (var j = 0; j < (n - (i + 1)); j++) {
if (arr[j] > arr[j + 1]) {
t = arr[j + 1];
arr[j + 1] = arr[j];
arr[j] = t;
} else {
break outer;
}
}
};
MDN Doc for label 确实表明这些非常不常见,但它们正是为此目的而设计的。
另请注意,我没有查看您的冒泡排序算法的准确性或其他方面 - 如果您对此有疑问,那么 Junaid Ahmed 的回答可能会更好地帮助您。
他的回答是最准确的,他帮助我理解了我的代码应该如何让我的想法在这个例子中发挥作用。
var arr = [11, 12, 0, 1, 2, 4, 3, 5, 7, 6, 8, 9, 10, 13];
var n = arr.length, t, swap = true;
for (var i = 0; (i < n) && (swap === true); ++i) {
swap = false;
for (var j = 0; j < ( n - (i + 1) ); ++j) {
if ( arr[j] > arr[j + 1] ) {
t = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = t;
swap = true;
}
console.log('swap = ' + swap);
}
console.log('j = ' + j);
console.log('i = ' + i);
};
这是我的第一个问题。我在研究JS中冒泡排序的实现
代码似乎无法正常工作。 请帮我解决一下
var arr = [11, 12, 0, 1, 2, 4, 3, 5, 6, 7, 8, 9, 10, 13];
var n = arr.length;
var t;
var swap = true;
for (var i = 0; (i < n) && (swap === true); i++) {
for (var j = 0; j < (n - (i + 1)); j++) {
if (arr[j] > arr[j + 1]) {
t = arr[j + 1];
arr[j + 1] = arr[j];
arr[j] = t;
swap = true;
} else {
swap = false;
}
}
};
var swap = true;
for (var i = 0; (i < n) && (swap === true); ++i) {
swap = false;
for (var j = 0; j < ( n - (i + 1) ); ++j) {
if ( arr[j] > arr[j + 1] ) {
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
swap = true;
}
}
}
一旦loopi没有交换任何数字,"swap"将为假,然后我们可以退出循环。
循环不知道数组何时排序,因此您不可能知道何时停止 i
循环。
如果你想让冒泡排序起作用,你应该把swap
变量逻辑去掉。
var arr = [11, 12, 0, 1, 2, 4, 3, 5, 6, 7, 8, 9, 10, 13];
var n = arr.length;
var t;
var swap = true;
for (var i = 0; i < n; i++) {
for (var j = 0; j < n; j++) {
if (arr[j] > arr[j + 1]) {
t = arr[j + 1];
arr[j + 1] = arr[j];
arr[j] = t;
}
}
};
但是完成冒泡排序的更好方法是 this。
如果你想提前中断外循环,你可以使用 Javascript 中的标签来实现。
outer:
for (var i = 0; i < n; i++) {
inner:
for (var j = 0; j < (n - (i + 1)); j++) {
if (arr[j] > arr[j + 1]) {
t = arr[j + 1];
arr[j + 1] = arr[j];
arr[j] = t;
} else {
break outer;
}
}
};
MDN Doc for label 确实表明这些非常不常见,但它们正是为此目的而设计的。
另请注意,我没有查看您的冒泡排序算法的准确性或其他方面 - 如果您对此有疑问,那么 Junaid Ahmed 的回答可能会更好地帮助您。
他的回答是最准确的,他帮助我理解了我的代码应该如何让我的想法在这个例子中发挥作用。
var arr = [11, 12, 0, 1, 2, 4, 3, 5, 7, 6, 8, 9, 10, 13];
var n = arr.length, t, swap = true;
for (var i = 0; (i < n) && (swap === true); ++i) {
swap = false;
for (var j = 0; j < ( n - (i + 1) ); ++j) {
if ( arr[j] > arr[j + 1] ) {
t = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = t;
swap = true;
}
console.log('swap = ' + swap);
}
console.log('j = ' + j);
console.log('i = ' + i);
};