0

0

js如何实现数组快速排序 3种快速排序算法实现方案分享

冰火之心

冰火之心

发布时间:2025-06-28 21:26:01

|

711人浏览过

|

来源于php中文网

原创

快速排序是一种基于“分而治之”策略的高效排序算法,其核心是选定一个基准值,将数组分为两部分,使得左边元素小于基准值,右边元素大于基准值,然后递归地对左右子数组排序。文章介绍了三种javascript实现方案:1. lomuto分区方案选择最后一个元素为基准,通过指针i划分边界,优点简单直观但易导致分区不平衡;2. hoare分区方案使用双指针从两端向中间扫描并交换元素,效率更高,尤其适用于已部分排序的数据;3. 随机化快速排序在每次分区时随机选择基准值,避免最坏情况,提升平均性能。三者中,lomuto适合教学理解,hoare更高效但代码复杂,随机化方案通常最优。此外,快速排序空间复杂度理想为o(log n),最坏情况下退化为o(n),随机化可有效改善此问题。

js如何实现数组快速排序 3种快速排序算法实现方案分享

快速排序,简单来说,就是通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。

js如何实现数组快速排序 3种快速排序算法实现方案分享

解决方案

js如何实现数组快速排序 3种快速排序算法实现方案分享

快速排序的核心在于“分而治之”,选定一个基准值,将数组分成两部分,小于基准值的放左边,大于基准值的放右边,然后递归地对左右两部分进行排序。下面分享三种常见的JavaScript快速排序实现方案。

js如何实现数组快速排序 3种快速排序算法实现方案分享

副标题1: 经典快速排序(Lomuto 分区方案)

Lomuto 分区方案是快速排序最经典也是最容易理解的实现方式。它选择数组的最后一个元素作为基准值,并使用一个指针 i 来跟踪小于基准值的元素的边界。

function quickSortLomuto(arr, low, high) {
  if (low < high) {
    let partitionIndex = partitionLomuto(arr, low, high);

    quickSortLomuto(arr, low, partitionIndex - 1);
    quickSortLomuto(arr, partitionIndex + 1, high);
  }
  return arr;
}

function partitionLomuto(arr, low, high) {
  let pivot = arr[high];
  let i = (low - 1); // Index of smaller element

  for (let j = low; j <= high - 1; j++) {
    // If current element is smaller than or equal to pivot
    if (arr[j] <= pivot) {
      i++;    // increment index of smaller element
      swap(arr, i, j);
    }
  }
  swap(arr, i + 1, high);
  return (i + 1);
}

function swap(arr, i, j) {
    let temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}

// 示例
let arr = [10, 7, 8, 9, 1, 5];
let n = arr.length;
quickSortLomuto(arr, 0, n - 1);
console.log("排序后的数组: " + arr);

这种方案的优点是简单直观,易于理解。缺点是在某些情况下,例如当数组已经部分排序时,性能会下降,因为每次都选择最后一个元素作为基准值,可能导致分区不平衡。

副标题2: Hoare 分区方案

Hoare 分区方案与 Lomuto 方案不同,它使用两个指针,一个从左向右移动,一个从右向左移动,直到它们相遇。这种方案通常比 Lomuto 方案更有效率,尤其是在处理已经部分排序的数组时。

function quickSortHoare(arr, low, high) {
  if (low < high) {
    let partitionIndex = partitionHoare(arr, low, high);

    quickSortHoare(arr, low, partitionIndex);
    quickSortHoare(arr, partitionIndex + 1, high);
  }
  return arr;
}

function partitionHoare(arr, low, high) {
  let pivot = arr[low]; // 选择第一个元素作为基准
  let i = low - 1;
  let j = high + 1;

  while (true) {
    do {
      i++;
    } while (arr[i] < pivot);

    do {
      j--;
    } while (arr[j] > pivot);

    if (i >= j) {
      return j;
    }

    swap(arr, i, j);
  }
}

function swap(arr, i, j) {
    let temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}

// 示例
let arr = [10, 7, 8, 9, 1, 5];
let n = arr.length;
quickSortHoare(arr, 0, n - 1);
console.log("排序后的数组: " + arr);

Hoare 分区方案的关键在于 ij 指针的移动和交换,最终返回 j 作为分区点。需要注意的是,quickSortHoare 递归调用时,右侧子数组的范围是 partitionIndex + 1, high,与 Lomuto 方案略有不同。

LALAL.AI
LALAL.AI

AI人声去除器和声乐提取工具

下载

副标题3: 随机化快速排序

为了避免快速排序在特定输入下退化成 O(n^2) 的时间复杂度,可以采用随机化快速排序。随机化快速排序的核心是在每次分区时,随机选择一个元素作为基准值。

function quickSortRandomized(arr, low, high) {
  if (low < high) {
    let partitionIndex = randomizedPartition(arr, low, high);

    quickSortRandomized(arr, low, partitionIndex - 1);
    quickSortRandomized(arr, partitionIndex + 1, high);
  }
  return arr;
}

function randomizedPartition(arr, low, high) {
    let randomIndex = Math.floor(Math.random() * (high - low + 1)) + low;
    swap(arr, randomIndex, high); // 将随机选择的元素与最后一个元素交换
    return partitionLomuto(arr, low, high); // 使用 Lomuto 分区方案
}

function swap(arr, i, j) {
    let temp = arr[i];
    arr[i] = arr[j];
    arr[j] = temp;
}

// 示例
let arr = [10, 7, 8, 9, 1, 5];
let n = arr.length;
quickSortRandomized(arr, 0, n - 1);
console.log("排序后的数组: " + arr);

随机化快速排序通过随机选择基准值,可以有效地避免最坏情况的发生,从而提高算法的平均性能。这里选择随机元素与最后一个元素交换,然后使用 Lomuto 分区方案,当然也可以结合 Hoare 分区方案。

副标题4:三种方案的性能比较和选择建议

三种快速排序方案各有优缺点。

  • Lomuto 分区方案: 简单易懂,但对于已经部分排序的数组,性能较差。
  • Hoare 分区方案: 通常比 Lomuto 方案更有效率,尤其是在处理已经部分排序的数组时。但代码相对复杂一些。
  • 随机化快速排序: 通过随机选择基准值,可以有效地避免最坏情况的发生,提高算法的平均性能。

选择哪种方案取决于具体的应用场景。如果对性能要求不高,且数组随机性较好,可以选择 Lomuto 方案。如果需要处理可能已经部分排序的数组,或者对性能有较高要求,可以选择 Hoare 方案或随机化快速排序。 随机化快速排序通常是最佳选择,因为它可以在各种情况下提供良好的平均性能。

副标题5: 快速排序的空间复杂度

快速排序是一种原地排序算法,这意味着它只需要少量的额外空间。在理想情况下(每次分区都将数组分成大致相等的两部分),快速排序的空间复杂度为 O(log n),这是因为递归调用栈的深度为 log n。 然而,在最坏情况下(每次分区都将数组分成一个空数组和一个包含 n-1 个元素的数组),快速排序的空间复杂度会退化为 O(n)。

通过随机化选择基准值,可以降低最坏情况发生的概率,从而使快速排序的空间复杂度在大多数情况下保持在 O(log n) 级别。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

397

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

575

2023.08.10

js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

515

2023.06.20

js获取当前时间
js获取当前时间

JS全称JavaScript,是一种具有函数优先的轻量级,解释型或即时编译型的编程语言;它是一种属于网络的高级脚本语言,主要用于Web,常用来为网页添加各式各样的动态功能。js怎么获取当前时间呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

244

2023.07.28

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

320

2023.08.03

js是什么意思
js是什么意思

JS是JavaScript的缩写,它是一种广泛应用于网页开发的脚本语言。JavaScript是一种解释性的、基于对象和事件驱动的编程语言,通常用于为网页增加交互性和动态性。它可以在网页上实现复杂的功能和效果,如表单验证、页面元素操作、动画效果、数据交互等。

5330

2023.08.17

js删除节点的方法
js删除节点的方法

js删除节点的方法有:1、removeChild()方法,用于从父节点中移除指定的子节点,它需要两个参数,第一个参数是要删除的子节点,第二个参数是父节点;2、parentNode.removeChild()方法,可以直接通过父节点调用来删除子节点;3、remove()方法,可以直接删除节点,而无需指定父节点;4、innerHTML属性,用于删除节点的内容。

481

2023.09.01

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

212

2023.09.04

C++ 设计模式与软件架构
C++ 设计模式与软件架构

本专题深入讲解 C++ 中的常见设计模式与架构优化,包括单例模式、工厂模式、观察者模式、策略模式、命令模式等,结合实际案例展示如何在 C++ 项目中应用这些模式提升代码可维护性与扩展性。通过案例分析,帮助开发者掌握 如何运用设计模式构建高质量的软件架构,提升系统的灵活性与可扩展性。

14

2026.01.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Django 教程
Django 教程

共28课时 | 3.7万人学习

Excel 教程
Excel 教程

共162课时 | 14.5万人学习

MongoDB 教程
MongoDB 教程

共17课时 | 2.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号