当前位置:首页 > JavaScript

js sort源码实现

2026-01-30 22:48:42JavaScript

JavaScript 的 Array.prototype.sort 方法在 V8 引擎中的实现会根据数组类型和长度选择不同的排序算法,主要分为以下情况:

小数组(长度 ≤ 10)

使用插入排序(Insertion Sort),因为对于小规模数据,插入排序的时间复杂度接近 $O(n)$,且常数项较低。

// 插入排序核心逻辑(简化版)
function insertionSort(arr, compareFn) {
  for (let i = 1; i < arr.length; i++) {
    const current = arr[i];
    let j = i - 1;
    while (j >= 0 && compareFn(arr[j], current) > 0) {
      arr[j + 1] = arr[j];
      j--;
    }
    arr[j + 1] = current;
  }
  return arr;
}

大数组(长度 > 10)

使用快速排序(QuickSort)的变体——TimSort(混合排序算法)。V8 会对数组进行以下处理:

  1. 检查数组是否已接近有序(如升序/降序),若接近有序则使用优化路径。
  2. 递归执行快速排序,但会限制递归深度,若超过阈值则转为堆排序(HeapSort)避免最坏情况下的 $O(n^2)$ 时间复杂度。
// 快速排序核心分区逻辑(简化版)
function quickSort(arr, compareFn, left, right) {
  if (left < right) {
    const pivotIndex = partition(arr, compareFn, left, right);
    quickSort(arr, compareFn, left, pivotIndex - 1);
    quickSort(arr, compareFn, pivotIndex + 1, right);
  }
}

function partition(arr, compareFn, left, right) {
  const pivot = arr[right];
  let i = left;
  for (let j = left; j < right; j++) {
    if (compareFn(arr[j], pivot) <= 0) {
      [arr[i], arr[j]] = [arr[j], arr[i]];
      i++;
    }
  }
  [arr[i], arr[right]] = [arr[right], arr[i]];
  return i;
}

特殊优化

  • 数字数组:V8 会检测数组元素是否全为数字,若为数字则使用数值比较而非字符串比较,性能显著提升。
  • 对象数组:根据 compareFn 的复杂度可能触发不同优化路径。

默认比较规则

若未提供 compareFn,元素会被强制转换为字符串后按 Unicode 码点排序:

js sort源码实现

const defaultCompare = (a, b) => {
  const aStr = String(a);
  const bStr = String(b);
  return aStr < bStr ? -1 : aStr > bStr ? 1 : 0;
};

注意事项

  • 排序稳定性:ES2019 规定 sort 必须稳定(相同元素保持原始顺序),现代浏览器均遵守。
  • 稀疏数组:空位(empty)会被视为 undefined 参与排序。

标签: 源码js
分享给朋友:

相关文章

vue实现找回密码源码

vue实现找回密码源码

以下是一个基于 Vue.js 的找回密码功能实现方案,包含前端组件和后端交互逻辑的核心代码示例: 找回密码表单组件 <template> <div class="forgo…

js实现 拖动

js实现 拖动

实现拖动的步骤 HTML 结构 创建一个可拖动的元素和一个放置区域: <div id="draggable" draggable="true">拖动我</div> <d…

vue compile源码实现

vue compile源码实现

Vue 的模板编译(compile)是将模板字符串转换为渲染函数的过程,涉及解析、优化和代码生成三个阶段。以下是其核心实现原理的分析: 解析阶段(Parse) 将模板字符串转换为抽象语法树(AST)…

js实现图片滚动

js实现图片滚动

图片滚动的实现方法 使用CSS动画实现 通过CSS的animation和@keyframes可以实现简单的图片滚动效果。这种方法适合静态图片的无缝循环滚动。 <style> .scr…

js实现图片移动

js实现图片移动

使用CSS和JavaScript实现图片移动 方法一:使用CSS动画结合JavaScript控制 通过CSS定义动画关键帧,JavaScript动态添加或移除动画类。 /* CSS部分 */ .m…

js实现同步

js实现同步

同步与异步的概念 在JavaScript中,同步代码会按照顺序执行,每一行代码必须等待上一行代码执行完成后才能运行。异步代码则允许在等待某些操作(如网络请求)完成的同时继续执行其他代码。 实现同步的…