我是 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
相同的值它正在工作!您只需在之前停止一个元素(当
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]