JS排序算法实现_快速排序优化方案

快速排序平均时间复杂度为O(n log n),通过三数取中和小数组插入排序可优化性能。

js排序算法实现_快速排序优化方案

快速排序是一种高效的排序算法,平均时间复杂度为 O(n log n),但在极端情况下可能退化到 O(n²)。为了提升其稳定性和性能,可以通过多种方式对基础快排进行优化。以下是 JavaScript 中实现快速排序及其常见优化策略。

1. 基础快速排序实现

快速排序基于分治思想:选择一个基准元素(pivot),将数组分为两部分,左边小于等于 pivot,右边大于 pivot,然后递归处理左右子数组。

function quickSort(arr) {  if (arr.length <= 1) return arr;

const pivot = arr[Math.floor(arr.length / 2)];const left = [];const middle = [];const right = [];

for (let val of arr) {if (val pivot) right.push(val);else middle.push(val);}

return [...quickSort(left), ...middle, ...quickSort(right)];}

这个版本清晰易懂,但使用了额外空间,且在重复元素多时效率不高。

2. 原地快排(In-place 快排)

通过双指针在原数组上操作,减少空间占用,提升缓存利用率。

function quickSortInPlace(arr, low = 0, high = arr.length - 1) {  if (low < high) {    const pivotIndex = partition(arr, low, high);    quickSortInPlace(arr, low, pivotIndex - 1);    quickSortInPlace(arr, pivotIndex + 1, high);  }  return arr;}

function partition(arr, low, high) {const pivot = arr[high]; // 选最后一个为基准let i = low - 1;

for (let j = low; j < high; j++) {if (arr[j] <= pivot) {i++;[arr[i], arr[j]] = [arr[j], arr[i]];}}[arr[i + 1], arr[high]] = [arr[high], arr[i + 1]];return i + 1;}

这种实现空间复杂度降到 O(log n)(递归),是更实用的版本。

3. 优化方案一:三数取中法选基准

避免最坏情况(如已排序数组),不直接选首尾或中间元素,而是取头、中、尾三个元素的中位数作为 pivot。

function medianOfThree(arr, low, mid, high) {  if (arr[low] > arr[mid]) [arr[low], arr[mid]] = [arr[mid], arr[low]];  if (arr[mid] > arr[high]) [arr[mid], arr[high]] = [arr[high], arr[mid]];  if (arr[low] > arr[mid]) [arr[low], arr[mid]] = [arr[mid], arr[low]];  return mid;}

在 partition 前调用该函数获取更合理的 pivot 索引,可显著减少比较次数。

4. 优化方案二:小数组改用插入排序

当子数组长度小于某个阈值(如 10)时,插入排序比快排更快,因常数项更小。

function insertionSort(arr, low, high) {  for (let i = low + 1; i = low && arr[j] > key) {      arr[j + 1] = arr[j];      j--;    }    arr[j + 1] = key;  }}

修改主函数逻辑:

function optimizedQuickSort(arr, low = 0, high = arr.length - 1) {  while (low < high) {    if (high - low < 10) {      insertionSort(arr, low, high);      break;    }
const pivotIndex = partition(arr, low, high);// 优化:先处理较小的一边,减少递归栈深度if (pivotIndex - low < high - pivotIndex) {  optimizedQuickSort(arr, low, pivotIndex - 1);  low = pivotIndex + 1;} else {  optimizedQuickSort(arr, pivotIndex + 1, high);  high = pivotIndex - 1;}

}return arr;}

5. 其他优化建议

三路快排(Dutch National Flag):适用于大量重复元素。将数组分为小于、等于、大于 pivot 三部分,等于的部分不再参与后续排序。随机化 pivot:随机选择基准,降低被构造数据攻击的风险。尾递归优化:手动控制递归方向,优先处理小分区,使栈深度最大为 O(log n)。

基本上就这些。结合三数取中、小数组切换插入排序、三路划分等策略,可以让快排在各种输入下都表现稳健。实际开发中虽然很少手写排序,但理解这些优化有助于深入掌握算法设计思想。

以上就是JS排序算法实现_快速排序优化方案的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1538876.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
日期时间处理指南_Moment.js替代方案
上一篇 2025年12月21日 05:29:10
前端JS怎样与Spring缓存机制配合_前端JS与Spring缓存机制配合使用方法
下一篇 2025年12月21日 05:29:25

相关推荐

  • VSCode怎么贴小图_VSCode插入图片与Markdown图片预览教程

    VSCode怎么贴小图_VSCode插入图片与Markdown图片预览教程VSCode怎么贴小图_VSCode插入图片与Markdown图片预览教程VSCode怎么贴小图_VSCode插入图片与Markdown图片预览教程VSCode怎么贴小图_VSCode插入图片与Markdown图片预览教程

    答案:在VSCode中插入Markdown图片需使用语法,路径推荐用相对路径,预览依赖内置功能或扩展;可通过HTML 标签调整大小,常见问题为路径错误,建议使用Paste Image等扩展提升效率,高级效果如图文混排需结合HTML与CSS,但需注意平台兼容性。 VSCode中插入图片,特别是Mark…

    2026年8月31日 用户投稿
    000
  • 如何在Java中使用LinkedHashSet

    LinkedHashSet继承HashSet并保持插入顺序,适用于去重且需顺序的场景。1. 创建时可指定初始容量;2. add()添加元素,自动去重;3. 遍历时按插入顺序输出;4. 支持remove()、contains()等操作;5. 常用于关键词去重、缓存等。注意:允许null、非线程安全。 …

    2026年8月31日
    200
  • Swoole怎么给WebSocket连接设置别名或用户ID

    使用fd与用户ID的映射表可实现Swoole中WebSocket按用户推送消息,通过全局数组或SwooleTable存储fd↔uid对应关系,在用户登录时绑定,断开时解绑,结合Redis支持多进程或多机部署。 在使用 Swoole 开发 WebSocket 服务时,经常需要为每个连接绑定用户 ID …

    2026年8月31日
    500
  • Linux基本操作+命令介绍

    1.Linux基本操作1.1Linux的目录结构 windows的目录结构是带有盘符的。d: e: c: 在Xterm中输入ls / 查看Linux的顶级目录。 代码语言:javascript代码运行次数:0运行复制 1. root:该目录为系统管理员HOME目录2. bin:这个目录下放着经常使用…

    2026年8月31日
    200
  • JVM内存与垃圾回收篇第11章直接内存

    JVM内存与垃圾回收篇第11章直接内存JVM内存与垃圾回收篇第11章直接内存JVM内存与垃圾回收篇第11章直接内存JVM内存与垃圾回收篇第11章直接内存

    第 11 章 直接内存 1、直接内存概述 直接内存不属于虚拟机运行时数据区的一部分,也不是《java虚拟机规范》中定义的内存区域。它是java堆外的、直接向系统申请的内存区间。直接内存来源于nio,通过存在堆中的directbytebuffer操作native内存。通常,访问直接内存的速度会优于ja…

    2026年8月31日 用户投稿
    1100
  • VSCode用户代码片段管理_VSCode自定义模板快速创建入口

    VSCode通过用户代码片段和自定义模板显著提升开发效率。1. 可通过“文件 > 首选项 > 用户代码片段”为特定语言或全局创建代码片段,使用prefix触发、body定义代码结构、description标注用途。2. 合理管理需区分语言特定与全局片段,避免prefix冲突,善用desc…

    2026年8月31日
    700
  • Java中引用和实现外部.class文件定义的接口:Classpath管理详解

    本文详细阐述了如何在Java项目中使用已编译的.class文件,特别是当这些文件定义了接口时。核心在于理解和正确配置Java的classpath,它指示JVM和编译器查找类和资源文件的路径。教程将通过命令行示例,指导读者如何在编译和运行时将.class文件加入classpath,从而成功引用并实现其…

    2026年8月30日
    100
  • Listen1怎么分享播放列表_Listen1分享播放列表的多种方法

    可通过生成链接、导出文件、二维码或第三方账号同步分享Listen1播放列表。一、在播放列表点击更多选项,选择“生成分享链接”,复制链接通过社交软件发送;二、点击“导出”保存为JSON或M3U文件,通过云盘或U盘传输;三、使用“生成二维码”功能,对方扫码即可导入;四、绑定网易云、QQ音乐等账户,将列表…

    2026年8月30日
    100
  • PHP 中获取 Node.js 设置的 Cookie

    本文旨在指导开发者如何在 PHP 应用中获取由 Node.js 应用设置的 Cookie。我们将通过一个简单的 Node.js 示例来设置 Cookie,并在 PHP 中演示如何读取这些 Cookie,从而帮助读者理解跨平台 Cookie 传递与获取的原理和方法。 从 Node.js 设置 Cook…

    2026年8月30日
    100
  • VSCode怎么弄HTML_VSCode创建和编写HTML文件基础入门教程

    VSCode怎么弄HTML_VSCode创建和编写HTML文件基础入门教程VSCode怎么弄HTML_VSCode创建和编写HTML文件基础入门教程VSCode怎么弄HTML_VSCode创建和编写HTML文件基础入门教程VSCode怎么弄HTML_VSCode创建和编写HTML文件基础入门教程

    答案:VSCode通过Emmet、Live Server等扩展和智能提示功能,极大提升了HTML编写效率,其语义化标签支持与实时预览能力让开发更高效流畅。 在VSCode里处理HTML,其实比想象中要简单直观得多,它简直就是为前端开发量身定制的。对我来说,它不仅是一个编辑器,更像是一个高效的工作伙伴…

    2026年8月30日 用户投稿
    500
  • VSCode怎么打出基本代码_VSCode使用代码片段快速生成基础结构教程

    VSCode通过内置、自定义和扩展三种方式实现代码片段快速生成,提升开发效率。使用内置片段如html:5或log可一键生成常用结构;通过“Configure User Snippets”创建自定义片段,如用rfc生成React函数组件,并利用$1、$2等占位符实现光标跳转与同步编辑;安装高评分扩展如…

    2026年8月30日
    300
  • VSCode怎么保存代码C_VSCode编写和保存C语言代码的注意事项教程

    答案:在VSCode中保存C语言代码需按Ctrl+S或Cmd+S,并确保文件以.c结尾;为实现高亮、格式化与调试,需安装C/C++扩展,设置语言模式为C,配置tasks.json编译、launch.json调试,安装clang-format实现保存时自动格式化,且确保GDB就位。 在VSCode中保…

    2026年8月30日
    100
  • 如何用AI分析数据_使用ChatGPT进行数据分析与可视化

    如何用AI分析数据_使用ChatGPT进行数据分析与可视化如何用AI分析数据_使用ChatGPT进行数据分析与可视化如何用AI分析数据_使用ChatGPT进行数据分析与可视化如何用AI分析数据_使用ChatGPT进行数据分析与可视化

    答案:使用AI分析数据需将任务转化为自然语言指令,核心步骤包括数据准备、指令设计、结果解读与迭代优化。首先清洗数据并转为CSV/JSON格式,确保字段清晰;其次设计明确具体的指令,分步引导分析,如“计算各产品总销售额并排序”;然后通过人工核对或与其他工具对比验证结果准确性;ChatGPT可生成基础图…

    2026年8月30日 用户投稿
    000
  • Listen1如何同步播放列表_Listen1同步播放列表的实现方法

    要实现Listen1播放列表同步,需先确保所有设备使用同一账号登录。1、点击右上角“登录”,输入邮箱密码并确认显示用户名。2、进入左下角设置,开启“自动同步播放列表”功能。3、手动点击播放列表顶部的“同步”按钮强制刷新数据。4、检查网络连通性,必要时配置代理或核对API密钥有效性。5、若无法云同步,…

    2026年8月29日
    100
  • VSCode怎么弹出输出框_VSCode输出面板显示与隐藏管理教程

    输出面板是VSCode中用于集中查看任务、扩展、调试和Git等非交互式日志的核心工具,通过快捷键Ctrl+Shift+U快速打开,支持在不同输出通道间切换,可自定义自动弹出行为、位置及外观,与终端(交互式命令执行)和调试控制台(程序运行时交互)形成互补,提升开发效率。 在VSCode中,要弹出输出框…

    2026年8月29日
    300
  • 使用 Java 编码单词:基于字母表的字符映射教程

    本文档旨在指导开发者如何使用 Java 编程语言,根据预定义的字母表将单词编码为字符序列。我们将详细介绍实现此功能的代码,解释关键步骤,并提供示例代码,确保编码过程能够准确地保留单词的原始顺序。本教程将涵盖字符大小写处理、循环优化以及结果输出等关键方面,帮助读者掌握字符编码的核心技术。 ### 字符…

    2026年8月29日
    100
  • safari浏览器如何阻止广告重定向_safari浏览器广告重定向阻止方法

    首先启用Safari的“阻止弹出式窗口”功能,再安装Adblock Plus等广告拦截扩展并开启全局运行,接着清除历史记录与网站数据以删除潜在追踪脚本,最后可临时关闭JavaScript阻断重定向,但需注意可能影响网页功能。 如果您在浏览网页时发现 Safari 浏览器频繁跳转到广告页面,这可能是由…

    2026年8月29日
    100
  • 将 char[] 转换为 List:Arrays.asList() 的正确用法

    本文旨在深入解析 `Arrays.asList()` 方法在处理 `char[]` 数组时的行为。不同于 `Integer[]` 或 `String[]`,直接使用 `Arrays.asList()` 处理 `char[]` 会产生意外的结果,返回 `List` 而非预期的 `List`。本文将详细…

    2026年8月29日
    100
  • # Laravel 中高效加载关联模型 ID 数组的实践指南

    本文旨在介绍如何在 Laravel 中高效地加载关联模型的 ID 数组,避免多次使用 `transform` 函数,并通过 `pluck` 方法、循环处理以及使用查询构建器等多种方式,优化数据查询性能,最终提供简洁且高效的代码示例。在 Laravel 开发中,经常会遇到需要加载关联模型,并且只需要关…

    2026年8月29日
    400
  • VSCode怎么编写地图定位_VSCode集成地图API开发位置服务应用教程

    答案是集成地图API实现定位需选择服务商、引入SDK、初始化地图并调用定位功能。具体为:在VSCode中创建Web项目,引入百度等地图API的SDK,通过HTML页面加载地图容器,使用JavaScript初始化地图实例,并结合浏览器Geolocation API或地图SDK自带控件获取位置,最后添加…

    2026年8月29日
    100

发表回复

登录后才能评论
关注微信