JavaScript的排序(compareFunction)如何工作?

Oks*_*ana 3 javascript sorting

var arr = [5, 2, 1, -10, 8];

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

}) ; // 8, 5, 2, 1, -10
Run Code Online (Sandbox Code Playgroud)

这个回调如何工作?

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

请从内部解释这个特例.

输出console.log(首先,请解释此输出):

  5 2
  2 1
  1 -10
 -10 8
  1 8
  2 8
  5 8
Run Code Online (Sandbox Code Playgroud)

Nin*_*olz 11

这取决于实施.这个实际的实现,看起来像一个插入排序,有这么多的数据(可能是不同的,比如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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

实例,不适用于所有用户代理(例如,不在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));
Run Code Online (Sandbox Code Playgroud)
.as-console-wrapper { max-height: 100% !important; top: 0; }
Run Code Online (Sandbox Code Playgroud)


Jus*_*nas 5

.sort() 使用自定义函数必须返回数字,指示必须将女巫项目放在前面:

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


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


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

在此处输入图片说明

  • @Mahi 不,如果某些算法采用位于 `b` 之后的 `a`,并且必须将其交换位置 (2认同)