minIndex 始终 = i,即使多次更改其值?

问题描述 投票:0回答:1

我是 JavaScript 和编程新手(3 个月),我正在尝试制作一个排序算法可视化工具,就像您在 YouTube 上看到的那样。我遇到一个问题,通常使用的 for 循环只是快速实际可视化的方法,所以我只是用间隔替换了 for 循环。这对于冒泡、插入、快速和其他一些排序算法都有效,但我一生都无法让选择工作。由于某种原因,当调用 swap(index1, index2) 函数时 minIndex 和 SelectionI 始终相同。我做了很好的旧console.log,一切似乎都正常工作,直到交换功能。已经经历了 3 天的痛苦,没有任何进展,我需要帮助或指点

function selectionSort2() {
    let selectionI = 0;
    const selectionIloop = setInterval(() => {
        if(selectionI > arr.length) {
            clearInterval(selectionIloop);
        }
        let minIndex = selectionI;
        let selectionJ = selectionI+1;
        const selectionJloop = setInterval(() => { 
            if(selectionJ > arr.length) {
                clearInterval(selectionJloop);
            }
            if(arr[selectionJ] < arr[minIndex]) {
                minIndex = selectionJ;
            }
            selectionJ++;
        }, 100);
        swap(minIndex, selectionI);
        selectionI++;
    }, 100)
}

我能够通过将选择Jloop更改为这样的for循环来使其部分工作

function selectionSort() {
    let selectionI = 0;
    const selectionIloop = setInterval(() => {
        if(selectionI > arr.length) {
            clearInterval(selectionIloop);
        }
        let minIndex = selectionI;
        for(let j = selectionI+1; j < arr.length; j++) {
            if(arr[j] < arr[minIndex]) {
                minIndex = j;
            }
        } 
        swap(minIndex, selectionI);
        selectionI++;
    }, 100)
}

但是由于 for 循环没有 0.1 秒的延迟,因此该版本相对于其他 for 循环受到限制的算法具有不公平的优势。另请注意,当我在 for 循环中放置 0.1 秒的延迟作为 setTimeout() 时,它会导致与之前相同的问题。

起初我认为这可能是延迟时间,就像间隔不能具有相同的延迟时间,但即使在多次更改它们之后,它也无法正常工作。

以防万一这是我的交换功能:

function swap(index1, index2) {
    temp = arr[index1];
    arr[index1] = arr[index2];
    arr[index2] = temp;
}

我尝试将间隔时间更改为彼此不同。我尝试用带有超时的 for 循环替换间隔。我尝试用不同的方式完全重写它。应该发生的情况是 minIndex 应该是 arr 中最小数字的索引,其索引不小于 i+1,但 minIndex 总是与 i

相同的值
javascript sorting setinterval
1个回答
0
投票

它正在工作!您只需在之前停止一个元素(当

selectionI == arr.length
时;在本例中,当
selectionI == 6
时您就完成了)。

function selectionSort() {
    let selectionI = 0;
    const selectionIloop = setInterval(() => {
        if(selectionI >= arr.length) {             // Just changed here!
            console.log (arr);                     // And showed the result
            clearInterval(selectionIloop);
        }
        let minIndex = selectionI;
        for(let j = selectionI+1; j < arr.length; j++) {
            if(arr[j] < arr[minIndex]) {
                minIndex = j;
            }
        } 
        console.log(minIndex, selectionI);
        swap(minIndex, selectionI);
        selectionI++;
    }, 100)
}

function swap(index1, index2) {
    temp = arr[index1];
    arr[index1] = arr[index2];
    arr[index2] = temp;
}

arr = [ 100, 200, 3, 4, 5, 6 ];

selectionSort();

输出为:

2 0
3 1
4 2
5 3
4 4
5 5

[3, 4, 5, 6, 100, 200]
© www.soinside.com 2019 - 2024. All rights reserved.