[英]Infinite loop while building mergesort in JavaScript
我正在尝试构建一个猴子补丁版本的mergeSort
但我每次都遇到错误。 我已经运行了几次调试器,看起来一切都在正确排序,直到我跳到loader.js文件中的一行的最后一步。
谁能帮我看看这个? 提前致谢!
Array.prototype.mergeSort = function(callback) {
if (this.length <= 1) return this;
if (!callback) {
callback = function(x, y) {
if (x > y) return -1;
else if (x < y) return 1;
else return 0;
};
}
const mid = Math.floor(this.length / 2);
const sortedLeft = this.slice(0, mid).mergeSort(callback);
const sortedRight = this.slice(mid).mergeSort(callback);
return sortedLeft.merge(sortedRight, callback);
};
Array.prototype.merge = function(arr, callback) {
let merged = [];
while (this.length > 0 || arr.length > 0) {
if (callback(this[0], arr[0]) < 0) {
merged.push(arr.shift());
break;
} else if (callback(this[0], arr[0]) >= 0) {
merged.push(this.shift());
break;
}
}
merged = merged.concat(this);
merged = merged.concat(arr);
return merged;
};
当任一列表为空时,合并循环应该停止:而不是while (this.length > 0 || arr.length > 0)
你应该写:
while (this.length > 0 && arr.length > 0)
此外,您不应该在每次存储到merge
数组后break
循环,并且两次比较元素是多余的。
这是一个更正的版本:
Array.prototype.merge = function(arr, callback) {
let merged = [];
while (this.length > 0 && arr.length > 0) {
if (callback(this[0], arr[0]) < 0) {
merged.push(arr.shift());
} else {
merged.push(this.shift());
}
}
merged = merged.concat(this);
return merged.concat(arr);
};
但是请注意,您的merge
方法按降序对数组进行排序,并且默认callback
函数也按降序比较元素,从而导致数组巧合按升序排序。 您可能希望简化此操作并在merge
接受一个null
回调函数。
这是一个更通用的版本:
Array.prototype.mergeSort = function(callback) {
if (this.length <= 1)
return this;
const mid = this.length >> 1;
const sortedLeft = this.slice(0, mid).mergeSort(callback);
const sortedRight = this.slice(mid).mergeSort(callback);
return sortedLeft.merge(sortedRight, callback);
};
Array.prototype.merge = function(arr, callback) {
let merged = [];
if (callback) {
while (this.length > 0 && arr.length > 0) {
if (callback(this[0], arr[0]) <= 0) {
merged.push(this.shift());
} else {
merged.push(arr.shift());
}
}
} else {
while (this.length > 0 && arr.length > 0) {
if (this[0] <= arr[0]) {
merged.push(this.shift());
} else {
merged.push(arr.shift());
}
}
}
return merged.concat(this).concat(arr);
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.