【问题标题】:How does JavaScript's sort (compareFunction) work? [duplicate]JavaScript 的排序 (compareFunction) 是如何工作的? [复制]
【发布时间】:2017-04-28 12:17:35
【问题描述】:
var arr = [5, 2, 1, -10, 8];

arr.sort(function(a, b) {
  console.log(a,b)
  return b - a;

}) ; // 8, 5, 2, 1, -10

这个回调是如何工作的?

选择a和b的原则是什么?

请从内部解释这个特定的例子。

输出console.log(首先请解释一下这个输出):

  5 2
  2 1
  1 -10
 -10 8
  1 8
  2 8
  5 8

【问题讨论】:

  • 如果它返回 +ve 然后交换,否则不。 ?
  • 我很困惑,你到底想要什么
  • 另外,进一步阅读 Pablo 提供的内容:stackoverflow.com/questions/24080785/…
  • 它按照documentation 描述的方式工作。
  • 请解释一下这个输出 查询各种对的顺序是引擎。引擎在项目之间进行最佳比较次数,以允许对输入进行排序。

标签: javascript sorting


【解决方案1】:

.sort()带有自定义函数必须返回数字,表示必须放在前面:

0 - 两个元素相等,不要改变顺序。
> 0 - 第二个元素必须放在第一个之前。


通常b - a 表示后代排序,而a - b 表示升序。


使用什么算法对元素进行排序取决于.sort 的浏览器实现。检查它们的比较:

【讨论】:

  • < 0 - First element must be placed before second 意思是不要改订单吗?
  • 我可以看这些 gif 几个小时 :) 很酷的例子。
  • @Mahi 例如 - 无论数据集如何,选择排序都具有相同的性能,冒泡排序对反向数据集的性能更差,对于几乎排序的数据集,shell 排序非常快,等等。此外,它的看起来很整洁。
  • @Mahi 不,如果某些算法采用位于b 之后的a 并且必须在某些地方交换它
  • @Timmetje 检查这个:youtube.com/watch?v=kPRA0W1kECg
【解决方案2】:

它会根据减去的值对项目进行排序,方法是将该值移动到更低或更高。

这里有一些信息:

https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/sort

如果提供了 compareFunction,则对数组元素进行排序 根据比较函数的返回值。如果 a 和 b 是 比较两个元素,然后:

  • 如果 compareFunction(a, b) 小于 0,则将 a 排序到比 b 低的索引,即 a 排在第一位。
  • 如果 compareFunction(a, b) 返回 0,则 a 和 b 彼此保持不变,但对所有不同的对象进行排序
    元素。注意:ECMAscript 标准不保证这一点
    行为,因此并非所有浏览器(例如 Mozilla 版本约会
    至少回到 2003 年)尊重这一点。
  • 如果 compareFunction(a, b) 大于 0,则将 b 排序到比 a 低的索引。
  • compareFunction(a, b) 在给定一对特定元素 a 和 b 作为其两个参数时,必须始终返回相同的值。如果 返回不一致的结果,则排序顺序未定义。

所以,比较函数的形式如下:

function compare(a, b) {
  if (a is less than b by some ordering criterion) {
    return -1;
  }
  if (a is greater than b by the ordering criterion) {
    return 1;
  }
  // a must be equal to b
  return 0;
}

要比较数字而不是字符串,比较函数可以简单地 从 a 中减去 b。以下函数将对数组进行排序 升序(如果它不包含 Infinity 和 NaN):

function compareNumbers(a, b) {
  return a - b;
}

【讨论】:

  • If compareFunction(a, b) is less than 0, sort a to a lower index than b, i.e. a comes first. 这是否意味着什么都不做?
  • 是的,它会跳过并检查下一个值。例如 [4,4,6] 前两个是 0,所以它不会移动它们。最后一对是 4, 6,它将是 4-6=-2 所以它将 4 向上移动数组,它将继续这样做,直到您的数组为 [6,4,4]
  • so can sort函数可以转换成if it return +ve then swap otherwise not . ?
  • 如果它对值做任何事情也是由算法决定的,但它不需要交换。在这种情况下,如果+它会降低A,如果-它会降低B。但至少它会降低A或者它会降低B。什么都不做时唯一的事情是0。
  • @Mahi 不,您不能在不丢失某些排序功能的情况下更改它。 JS 可以推断出你的数据集,所以它不需要做所有的比较,考虑1, 2, 3 - 如果比较1, 2,它会发现1 < 2 如果比较2, 3,它会发现2 < 3结合这两个事实,它可以跳过检查1, 3,因为它已经隐含了1 (< 2) < 3。如果您的排序算法表明 2 和 3 相等 (return 0),则从排序中得出的信息也可能不正确,具体取决于遍历数据集的方式 - 您最终可能会得到一个 [2, 1, 3] 数组。
【解决方案3】:

这取决于实现。这个实际的实现,看起来像一个insertion sort,具有这么多的数据(它可能会有所不同,例如 Chrome,以及少于 10 项或更多项的不同实现),从索引零到结尾,如果最后两个项目没有发生交换,然后停止,否则返回到索引零。

基本上它按这个顺序测试和更改

5   2   1 -10   8   original order
5   2
    2   1
        1 -10
          -10   8   swap
            8 -10
        1   8       swap
        8   1
    2   8           swap
    8   2
5   8               swap
8   5  2    1 -10   result

更复杂的排序更好地显示正在发生的事情,两个更大的值需要移动到数组的另一侧

8   9   1   2   3   4   original array
8   9
    9   1               swap
    1   9
8   1                   swap
1   8
        9   2           swap
        2   9
    8   2               swap
    2   8
1   2
            9   3       swap
            3   9
        8   3           swap
        3   8
    2   3
                9   4   swap
                4   9
            8   4       swap
            4   8
        3   4
1   2   3   4   8   9   result

实时示例,不适用于所有用户代理(例如,不在 Edge 中,但在 Chrome 中)

var array = [8, 9, 1, 2, 3, 4];
console.log(JSON.stringify(array));
array.sort(function (a, b) {
    console.log(a , b, JSON.stringify(array));
    return a - b;
});
console.log(JSON.stringify(array));
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

  • 他们想知道为什么,而不是如何。
  • @Feathercrown,我读到 “sort(compareFunction) 是如何工作的?”
  • 嗯,他们的问题最初是问为什么,不管标题如何,但他们还是改了。
  • 您的答案正确性取决于浏览器使用的排序算法和数据本身的性质,因此在一个浏览器中它可能是正确的,在其他浏览器中可能会有所不同。
  • @Justinas,是的,请查看编辑。
猜你喜欢
  • 1970-01-01
  • 2013-09-26
  • 2023-03-25
  • 1970-01-01
  • 2016-03-15
  • 2011-08-09
  • 2013-05-25
  • 2015-12-01
  • 1970-01-01
相关资源
最近更新 更多