合并排序与 JS 中的用户输入比较
Merge sort with user input comparisons in JS
我用 JS 编写了一个网页,让用户输入他喜欢的元素数量,然后让他获得这些元素的排名,对它们进行排序。一开始我做了所有的比较,这样我就可以在询问用户之前提前计划我需要哪些比较,但是...
这是 O(n²),显然不适合大于 5 的元素数。
我现在正在尝试实现合并排序,但我无法再计划所有需要的比较,我必须在合并过程中询问用户。这是我的代码的样子:
async function mergeSort(array) {
if (array.length < 2) return array;
const middle = Math.floor(array.length / 2);
const left = array.slice(0, middle);
const right = array.slice(middle, array.length);
const sortedLeft = mergeSort(left);
const sortedRight = mergeSort(right);
return mergeArrays(sortedLeft, sortedRight);
}
function mergeArrays(left, right) {
const res = [];
while (left.length && right.length) {
document.getElementById("left").innerHTML = left[0];
document.getElementById("right").innerHTML = right[0];
//???
res.push( /*left greater than right?*/ ? right.shift() : left.shift());
}
while (left.length) {
res.push(left.shift());
}
while (right.length) {
res.push(right.shift());
}
return res;
}
理想情况下,代码会等待用户单击“左”或“右”HTML 按钮,然后继续排序过程。但我不知道该怎么做,即使有承诺或回调。
可能不理想,但 confirm box 可能是一个快速的解决方案,因为它会阻止执行,直到用户单击按钮:
if (confirm("Is " + left[0] + " less than " + right[0] + "?")) {
res.push(left.shift());
}
else {
res.push(right.shift());
}
此 answer 中的评论说确认框按钮不能更改为 Yes/No
。
如果要寻找替代方案,请查看 this question 的答案。
我用 JS 编写了一个网页,让用户输入他喜欢的元素数量,然后让他获得这些元素的排名,对它们进行排序。一开始我做了所有的比较,这样我就可以在询问用户之前提前计划我需要哪些比较,但是...
这是 O(n²),显然不适合大于 5 的元素数。
我现在正在尝试实现合并排序,但我无法再计划所有需要的比较,我必须在合并过程中询问用户。这是我的代码的样子:
async function mergeSort(array) {
if (array.length < 2) return array;
const middle = Math.floor(array.length / 2);
const left = array.slice(0, middle);
const right = array.slice(middle, array.length);
const sortedLeft = mergeSort(left);
const sortedRight = mergeSort(right);
return mergeArrays(sortedLeft, sortedRight);
}
function mergeArrays(left, right) {
const res = [];
while (left.length && right.length) {
document.getElementById("left").innerHTML = left[0];
document.getElementById("right").innerHTML = right[0];
//???
res.push( /*left greater than right?*/ ? right.shift() : left.shift());
}
while (left.length) {
res.push(left.shift());
}
while (right.length) {
res.push(right.shift());
}
return res;
}
理想情况下,代码会等待用户单击“左”或“右”HTML 按钮,然后继续排序过程。但我不知道该怎么做,即使有承诺或回调。
可能不理想,但 confirm box 可能是一个快速的解决方案,因为它会阻止执行,直到用户单击按钮:
if (confirm("Is " + left[0] + " less than " + right[0] + "?")) {
res.push(left.shift());
}
else {
res.push(right.shift());
}
此 answer 中的评论说确认框按钮不能更改为 Yes/No
。
如果要寻找替代方案,请查看 this question 的答案。