在compareFunction(a, b)中,只有当我们需要交换a和b的位置时,我们才返回一个正值。
如果省略了compareFunction中的负Array.prototype.sort(),那么为什么开发人员应该编写返回负值的if-statement呢?
var list = [4, 5, 3, 5, 6, 9, 1, 4, 2];
list = list.sort(function(a, b) {
if (a > b) {
return 1;
}
});
console.log(list); // correct result
发布于 2017-08-19 17:00:07
这在你的情况下是可行的,因为你没有测试所有的可能性。但是,如果您查看实施内部,您会发现引擎没有在短数组(即。长度( <= 10)比长数组上长。实际上,insertion sort用于短数组,而QuickSort则用于长数组。
由于您的实现必须定义哪个数字更高、更低或等于另一个数字,所以在较长的数组中,它将失败,因为您忘记了实现“下面”大小写(并且隐含了相等的大小写,因为您的函数将在b >= a 这将被解释 as 0时返回它的值),因此QuickSort将无法正确排序数组,因为它无法知道某个数字小于另一个数字的时间,而插入排序由于它的算法而工作,如果我正确理解它的话,该算法依赖于“大于”的比较。
见下面的例子:
var shortList = [9, 8, 7, 6, 5, 4, 3, 2, 1, 0],
list = [10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0];
console.log('Works : ', shortList.sort(function(a, b) {
if (a > b) {
return 1;
}
})); // You're being lucky on this one. Insertion sort.
console.log('Doesnt work : ', list.sort(function(a, b) {
if (a > b) {
return 1;
}
})); // QuickSort
console.log('Works : ', list.sort(function(a, b) {
if (a > b) {
return 1;
} else if (a < b) {
return -1;
}
return a - b; // Can be reduced to 'return a - b';
})); // QuickSort
https://stackoverflow.com/questions/45773457
复制相似问题