当前位置:首页 > JavaScript

js sort源码实现

2026-01-30 22:48:42JavaScript

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

小数组(长度 ≤ 10)

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

js sort源码实现

// 插入排序核心逻辑(简化版)
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 码点排序:

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 sort源码实现

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

相关文章

js实现分页

js实现分页

实现分页的基本思路 分页功能通常需要处理数据分割、页码生成和用户交互。核心逻辑包括计算总页数、根据当前页截取数据、渲染页码按钮等。 前端分页实现(静态数据) 假设已有全部数据,仅需前端分页展示:…

js实现

js实现

实现 JavaScript 功能的方法 在 JavaScript 中实现特定功能通常涉及多个步骤。以下是常见的实现方法: 基础语法和变量声明 使用 let 或 const 声明变量: let co…

js实现分页

js实现分页

分页的基本实现思路 在JavaScript中实现分页功能通常需要结合前端和后端逻辑。前端负责渲染分页控件和处理用户交互,后端负责提供分页数据。 前端分页实现 纯前端分页适用于数据量较小的情况,可以直…

js 实现倒计时

js 实现倒计时

实现倒计时的基本方法 使用 JavaScript 实现倒计时可以通过 setInterval 或 setTimeout 结合日期计算来完成。以下是两种常见实现方式。 使用 setInterval…

js实现日历

js实现日历

实现日历的基本思路 使用JavaScript实现日历的核心是动态生成日期表格,并处理月份切换逻辑。需要计算当前月的天数、起始星期几,并动态渲染到页面上。 获取当前日期信息 通过Date对象获取当前年…

js实现图片预览

js实现图片预览

使用FileReader API实现图片预览 通过FileReader对象读取用户选择的图片文件并显示预览: const input = document.getElementById('imag…