JavaScript 中 sort 函数 为什么 return a-b 就是升序?

作者站长头像
站长
· 阅读数 19

在提出这个问题的时候也查阅了一些资料,了解到 v8 里的 sort 在不同的数组长度下采用不同的排序方式。

这里暂且我们就只考虑很基础的排序方式,也就是数组长度小于10的时候。

const arr=  [1,2,3,4];
arr.sort((a,b)=>
{return a-b}
)

我了解到此时的情况 sort 会采用插值排序,但是了解过插值排序的逻辑以后,并没有发现和 sort 回调函数 的返回值 a-b 有什么关系。

百思不得其解,特来请教。

回复
1个回答
avatar
test
2024-06-28

你可以试着手写一个 sort(),大致就明白了:

function sort<T>(arr: T[], compareFn?: (a: T, b: T) => number): T[] {
  if (!compareFn) {
    compareFn = (a, b) => (a + '').charCodeAt(0) - (b + '').charCodeAt(0);
  }

  const n = arr.length;
  for (let i = 1; i < n; i++) {
    for (let j = i; j > 0; j--) {
      if (compareFn(arr[j], arr[j - 1]) < 1) {
        [arr[j], arr[j - 1]] = [arr[j - 1], arr[j]];
      } else {
        break;
      }
    }
  }
  return arr;
}
// test
console.log(sort([3, 62, 10, 43]));
console.log(sort([3, 62, 10, 43], (a, b) => a - b));
console.log(sort([3, 62, 10, 43], (a, b) => b - a));

// [ 10, 3, 43, 62 ]
// [ 3, 10, 43, 62 ]
// [ 62, 43, 10, 3 ]
回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容