Я хочу сделать визуализатор алгоритма сортировки с JavaScript. Я скопировал алгоритм отсюда: https://www.geeksforgeeks.org/merge-sort/.
Я застрял с сортировкой слиянием из-за функции setTimeout (или, по крайней мере, я так думаю). Я считаю, что функция setTimeout ждет определенное время, но JavaScript также работает над другой функцией.
JavaScript
function mergeOneStep(i, j, curIndex, leftArray, rightArray) {
if (i >= leftArray.length && j >= rightArray.length) {
console.log("DONE");
updateDisplay();
return;
}
console.log(curIndex);
if (i < leftArray.length && j < rightArray.length) {
if (leftArray[i] <= rightArray[j]) {
console.log("BOTH i < j, %d %d %d %d", i, leftArray[i], j, rightArray[j]);
numbers[curIndex] = leftArray[i];
i++;
} else {
console.log(" BOTH j < i, %d %d %d %d", j, rightArray[j], i, leftArray[i]);
numbers[curIndex] = rightArray[j];
j++;
}
curIndex++;
console.log(curIndex);
}
else if (i < leftArray.length) {
console.log("i only %d %d", i, leftArray[i]);
numbers[curIndex] = leftArray[i];
i++, curIndex++;
console.log(curIndex);
}
else if (j < rightArray.length) {
console.log("j only %d %d", j, rightArray[j]);
numbers[curIndex] = rightArray[j];
j++, curIndex++;
console.log(curIndex);
}
updateDisplay();
setTimeout(function(a, b, c, d, e) { mergeOneStep(a, b, c, d, e); }, 10, i, j, curIndex, leftArray, rightArray);
}
function mergeSortProcess(left, right) {
if (left < right) {
const mid = Math.floor((left + right) / 2);
console.log("mergeSortProcess mid: %d", mid);
mergeSortProcess(left, mid);
mergeSortProcess(mid + 1, right);
var size1 = mid - left + 1;
var size2 = right - mid;
var leftArray = new Array(size1);
for (let i = 0; i < size1; i++) {
leftArray[i] = numbers[left + i];
}
var rightArray = new Array(size2);
for (let i = 0; i < size2; i++) {
rightArray[i] = numbers[mid + 1 + i];
}
var curIndex = left;
mergeOneStep(0, 0, curIndex, leftArray, rightArray);
}
}