当前位置:首页 > JavaScript

js sort源码实现

2026-04-04 14:36:49JavaScript

JavaScript sort 源码实现

JavaScript 的 Array.prototype.sort 方法的具体实现依赖于引擎(如 V8、SpiderMonkey 等)。以下是基于 V8 引擎的实现逻辑和关键细节:

排序算法选择

V8 使用混合排序策略(Hybrid Sort),结合快速排序(QuickSort)和插入排序(Insertion Sort):

js sort源码实现

  • 对于小型数组(长度 ≤ 10),使用插入排序。
  • 对于大型数组,使用快速排序,并在递归深度过深时切换为堆排序(HeapSort)以避免最坏情况。

关键步骤

快速排序分区 选取基准值(pivot)并将数组分为小于和大于基准值的两部分:

function partition(arr, low, high, compareFn) {
    const pivot = arr[high];
    let i = low;
    for (let j = low; j < high; j++) {
        if (compareFn(arr[j], pivot) < 0) {
            [arr[i], arr[j]] = [arr[j], arr[i]]; // Swap
            i++;
        }
    }
    [arr[i], arr[high]] = [arr[high], arr[i]]; // Move pivot
    return i;
}

插入排序 对小规模数组进行优化:

js sort源码实现

function insertionSort(arr, compareFn, low = 0, high = arr.length - 1) {
    for (let i = low + 1; i <= high; i++) {
        const key = arr[i];
        let j = i - 1;
        while (j >= low && compareFn(arr[j], key) > 0) {
            arr[j + 1] = arr[j];
            j--;
        }
        arr[j + 1] = key;
    }
}

比较函数处理

若未提供比较函数,默认将元素转换为字符串并比较 UTF-16 编码:

function defaultCompare(a, b) {
    const strA = String(a);
    const strB = String(b);
    if (strA < strB) return -1;
    if (strA > strB) return 1;
    return 0;
}

稳定性

ES2019 要求 sort 必须稳定(相等元素的原始顺序保留)。V8 通过以下方式实现:

  • 对小数组直接使用插入排序(天然稳定)。
  • 对大数组使用归并排序(MergeSort)的变体。

性能优化

  • 使用三数取中法(Median-of-Three)选择基准值以减少最坏情况。
  • 递归深度超过阈值时切换为堆排序。

注意事项

  • 原始数组会被修改(原地排序)。
  • 稀疏数组的空白元素会被排在末尾。
  • 比较函数应返回数值(负数、零、正数),而非布尔值。

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

相关文章

js轮播图实现原理

js轮播图实现原理

轮播图的基本原理 轮播图通过动态切换显示的内容(图片、文本等)实现视觉上的滑动效果。核心原理是利用CSS和JavaScript控制元素的显示与隐藏,或通过变换位置实现滑动动画。 实现方法一:…

js实现瀑布流

js实现瀑布流

实现瀑布流布局 瀑布流布局是一种常见的网页布局方式,常用于图片展示、商品列表等场景。以下是使用 JavaScript 实现瀑布流布局的几种方法。 纯 JavaScript 实现 通过计算元素的位置和…

如何调试react源码

如何调试react源码

调试React源码的方法 克隆React源码仓库到本地: git clone https://github.com/facebook/react.git cd react 安装依赖并构建开发版本:…

js实现dh

js实现dh

JavaScript 实现 DH(Diffie-Hellman)密钥交换 Diffie-Hellman(DH)密钥交换是一种安全协议,允许双方在不安全的通信信道上建立一个共享密钥。以下是如何在 Jav…

js实现图

js实现图

JavaScript 实现图的常用方法 在 JavaScript 中,图(Graph)可以通过多种方式实现,常见的包括邻接表(Adjacency List)和邻接矩阵(Adjacency Matrix…

js进度条实现

js进度条实现

使用HTML和CSS创建基础结构 在HTML中创建一个容器元素用于显示进度条,通常使用<div>元素。CSS用于设置进度条的样式,包括宽度、高度、颜色和圆角等属性。 <div cl…