Javascript的sort()是如何工作的?

2022-08-30 04:45:05

以下代码如何按数字顺序对此数组进行排序?

var array=[25, 8, 7, 41]

array.sort(function(a,b){
  return a - b
})

我知道,如果计算结果是...

小于 0:“a”排序为低于“b”的索引。
零:“a”和“b”被视为相等,并且不执行任何排序。
大于 0:“b”排序为低于“a”的索引。

数组排序回调函数在排序过程中是否被多次调用?

如果是这样,我想知道每次将哪两个数字传递到函数中。我假设它首先取“25”(a)和“8”(b),然后是“7”(a)和“41”(b),所以:

25(a) - 8(b) = 17(大于零,因此排序 “b” 为低于 “a”的索引):8, 25

7(a) - 41(b) = -34(小于零,因此将“a”排序为低于“b”的索引:7,41

那么这两组数字是如何相互排序的呢?

请帮助一个苦苦挣扎的新手!


答案 1

数组排序回调函数在排序过程中是否被多次调用?

是的

如果是这样,我想知道每次将哪两个数字传递到函数中

你可以通过以下方式找到你的自我:

array.sort((a,b) => {
  console.log(`comparing ${a},${b}`);
  return a > b ? 1
               : a === b ? 0 
                         : -1;
});

编辑

这是我得到的输出:

25,8
25,7
8,7
25,41

答案 2

JavaScript解释器内置了某种排序算法实现。它在排序操作期间多次调用比较函数。调用比较函数的次数取决于特定算法、要排序的数据以及排序之前的顺序。

某些排序算法在已排序的列表上表现不佳,因为它会导致它们进行比典型情况下更多的比较。其他人可以很好地处理预先排序的列表,但还有其他情况,他们可能被“欺骗”表现不佳。

有许多常用的排序算法,因为没有一种算法可以完美地满足所有目的。最常用于通用排序的两个是快速排序合并排序。快速排序通常是两者中更快的,但合并排序具有一些不错的属性,可以使其成为更好的整体选择。合并排序是稳定的,而快速排序不是。这两种算法都是可并行化的,但合并排序的工作方式使并行实现更加高效,在其他条件相同的情况下。

您的特定JavaScript解释器可能会使用其中一种算法或完全使用其他算法。ECMAScript 标准没有指定符合要求的实现必须使用的算法。它甚至明确否认了对稳定的需求。