Модификация JavaScript пузырьковой сортировки (цикл `i` останавливается до окончания сортировки.)
Мне нужна петля i
немедленно остановится, когда будет выполнена сортировка. Он не работает со всеми возможными значениями массива. Сортировка не происходит в некоторых случаях. перекручивание i
останавливается до окончания сортировки.
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;
}
}
};
4 ответа
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;
}
}
};
Но лучший способ выполнить пузырьковую сортировку - это.
Если вы хотите досрочно прервать внешний цикл, вы можете использовать метки в 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 для метки указывает, что они очень необычны, но они предназначены именно для этой цели.
Также обратите внимание, что я не смотрел на точность или нет вашего алгоритма сортировки пузырьков - если у вас есть проблемы с этим, то ответ Джунаид Ахмед может помочь вам лучше.
Ибинь Цю ответил на мой вопрос
Его ответ был самым точным, он помог мне понять, как должен выглядеть мой код, чтобы моя идея работала. В этом примере.
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);
};