当前位置:首页 > 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 控制 通过 JavaScript 动态添加或移除 CSS 类来触发动画。CSS 定义关键帧(@keyframes),JavaScript 通过 classL…

js实现轮播图

js实现轮播图

基础轮播图实现 使用HTML、CSS和JavaScript实现一个简单的自动轮播图。HTML结构包含一个容器和多个图片项。 <div class="slider"> <div…

原生js实现轮播图

原生js实现轮播图

基本结构搭建 HTML部分需要包含轮播图容器、图片列表及导航按钮。结构示例如下: <div class="slider-container"> <div class="slid…

js实现图片放大缩小

js实现图片放大缩小

实现图片放大缩小的基础方法 使用CSS的transform: scale()属性可以快速实现图片的放大缩小效果。通过JavaScript动态修改该属性值: const img = document.…

js实现报表

js实现报表

使用JavaScript实现报表 在JavaScript中实现报表功能可以通过多种方式完成,常见的方法包括使用原生JavaScript、第三方库(如Chart.js、D3.js)或结合后端数据渲染。以…

js实现驼峰

js实现驼峰

实现驼峰命名的几种方法 使用正则表达式和字符串替换 通过正则表达式匹配字符串中的特定模式(如下划线或短横线),并将其后的字母转换为大写,同时移除分隔符。 function toCamelCase(s…