Сортировка слиянием Al go Визуализатор javascript - PullRequest
0 голосов
/ 05 мая 2020

Я хочу сделать визуализатор алгоритма сортировки с 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);
    }
}
...