JS实现快速排序

排序算法是计算机科学中的一个基础问题,而快速排序(QuickSort)作为其中一种经典而高效的算法,一直备受推崇。其在平均情况下具有较好的性能,被广泛应用于实际场景中。本文将深入探讨快速排序的原理、实现方法以及其在排序算法领域的地位。

什么是快速排序

公众号:Code程序人生,个人网站:https://creatorblog.cn

快速排序(QuickSort)是一种高效的排序算法,最早由英国计算机科学家 Tony Hoare 在1960年提出。它属于比较排序算法,具有平均情况下较好的性能。快速排序的核心思想是通过选择一个基准元素,将数组分为左右两部分,左边的元素都小于基准,右边的元素都大于基准,然后对左右两部分分别递归进行排序。

如何实现快速排序

实现快速排序的关键在于选择基准元素和分割数组的过程。以下是一个基于 JavaScript 的简单实现:

// 快速排序函数
function quickSort(arr) {if (arr.length <= 1) {return arr; // 如果数组长度小于等于1,已经是有序的了}// 选择基准元素const pivot = arr[0];// 分割数组const left = [];const right = [];for (let i = 1; i < arr.length; i++) {if (arr[i] < pivot) {left.push(arr[i]);} else {right.push(arr[i]);}}// 递归排序左右两部分return [...quickSort(left), pivot, ...quickSort(right)];
}// 示例
const unsortedArray = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5];
const sortedArray = quickSort(unsortedArray);
console.log(sortedArray); // 输出 [1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9]

快速排序的实现原理

  1. 选择基准元素: 从数组中选择一个元素作为基准(通常选择第一个元素)。
  2. 分割数组: 将数组中小于基准的元素放在左边,大于基准的元素放在右边。
  3. 递归排序: 对左右两个子数组进行递归排序。

这样,通过不断递归和分割的过程,整个数组最终变得有序。

时间复杂度和空间复杂度

时间复杂度

快速排序的平均时间复杂度为O(n log n)。这是通过选择一个合适的基准元素,并将数组分为两半进行递归排序实现的。在每一层递归中,对整个数组的操作次数是线性的,而递归的层数是对数级别的。

因此,整体的时间复杂度为O(n log n)。然而,在最坏情况下,即每次选择的基准元素都是数组中的最大或最小值,导致分割极不平衡的情况下,快速排序的时间复杂度可能达到O(n^2)。为了缓解这种情况,通常会采用随机选择基准元素的方式。

空间复杂度

快速排序是一种原地排序算法,即它不需要额外的空间来存储临时数据。在每次递归调用中,只需要常量级别的额外空间来存储基准元素的值和分割数组的索引,因此空间复杂度是O(1)

需要注意的是,尽管空间复杂度是常量级别的,但快速排序是一种递归算法,递归调用会在系统栈上产生一定的开销。在处理大规模数据时,可能会导致栈溢出。因此,对于极大规模的数据集,可能需要考虑使用非递归的迭代版本来避免栈溢出的问题。

总结

快速排序是一种高效且常用的排序算法,其平均时间复杂度为O(n log n)。相较于其他排序算法,它不需要额外的空间,是一种原地排序算法。然而,在最坏情况下,快速排序的时间复杂度可能达到O(n^2),因此在实际应用中需要注意选择合适的基准元素,以避免最坏情况的发生。

通过选择一个基准元素,不断将数组分割为两部分并递归排序,快速排序展现了分治思想的典型应用。在处理大规模数据集时,快速排序通常表现出色,是排序算法中的佼佼者。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/182980.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

安装vmware_esxi 超详细

安装vmware_esxi 超详细 </h2><div id"cnblogs_post_body" class"blogpost-body blogpost-body-html">esxi安装手册 1、esxi介绍 ESXI原生架构模式的虚拟化技术&#xff0c;是不需要宿主操作系统的&#xff0c;它自己本身就是操作系统。因此…

vue3跟vue2的区别?

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;Vue篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来vue篇专栏内容:vue3和vue2的区别 目录 一、Vue3介绍 哪些变化 速度更快 体积更小 更易维护 compositon Api …

06 # 枚举类型

一个角色判断例子 function initByRole(role) {if (role 1 || role 2) {// do sth} else if (role 3 || role 4) {// do sth} else if (role 5) {// do sth} else {// do sth} }上面的代码存在的问题&#xff1a; 可读性差&#xff1a;很难记住数字的含义可维护性差&…

Redis 基础、字符串、哈希、有序集合、集合、列表以及与 Jedis 操作 Redis 和与 Spring 集成。

目录 1. 数据类型 1.1 字符串 1.2 hash 1.3 List 1.4 Set 1.5 sorted set 2. jedis操作redis 3. 与spring集成 1. 数据类型 1.1 字符串 String是最常用的数据格式&#xff0c;普通的kay-value都归结为此类&#xff0c; value值不仅可以是string&#xff0c;可以是数字…

【Apifox】token的使用方式和脚本示例

前言&#xff0c;关于token的使用&#xff0c;仅做了简单的demo测试token效果。 一、手动登录获取token 顾名思义&#xff0c;因为只有登录之后才有token的信息&#xff0c;所以在调用其他接口前需要拥有token才能访问。 操作步骤 1)添加环境变量、全局参数 这里拿测试环境举…

前端编码规范

文章目录 一、背景二、内容1、注释规范&#xff08;1&#xff09;文件注释&#xff08;2&#xff09;函数注释&#xff08;3&#xff09;单行注释&#xff08;3&#xff09;多行注释 2、命名规范&#xff08;1&#xff09;项目命名&#xff08;2&#xff09;目录命名&#xff0…

Bug 检查 0x7B:INACCESSIBLE_BOOT_DEVICE(未解决)

环境&#xff1a; HP ProDesk 480 G7 Win10 专业版 问题描述&#xff1a; INACCESSIBLE_BOOT_DEVICE bug 检查的值为0x0000007B。 此 bug 检查表明 Microsoft Windows 操作系统在启动过程中无法访问系统分区 原因&#xff1a; 1.INACCESSIBLE_BOOT_DEVICE bug 检查经常发生…

大数据Hadoop-HDFS_元数据持久化

大数据Hadoop-HDFS_元数据持久化 &#xff08;1&#xff09;在HDFS第一次格式化后&#xff0c;NameNode&#xff08;即图中的主NameNode&#xff09;就会生成fsimage和editslog两个文件&#xff1b; &#xff08;2&#xff09;备用NameNode&#xff08;即图中的备NameNode&…

【学习笔记】GAN实战(基础)

本文介绍构建和训练生成对抗网络(GAN)的方法。 生成对抗网络(GAN)与生成模型导论 生成对抗网络(Generative Adversarial Network,GAN) GAN简介 机器学习算法擅长识别已有数据中的模式,并将这种能力用于分类(为样本分配正确类别)和回归(根据一系列的输入进行数值…

【Lustre相关】功能实践-03-文件级冗余(FLR)

一、前言 DDN-03.11-File Level Redundancy (FLR) Category:FLR 1、功能介绍 在文件级冗余&#xff08;File Level Redundancy&#xff0c;FLR&#xff09;特性出现之前&#xff0c;Lustre文件系统数据冗余完全依赖于后端存储设备&#xff08;如RAID6&#xff09;。 Lustre在L…

SpringCloudSleuth+Zipkin 整合及关键包汇总

背景 整合了一下 SpringCloudSleuth Zipkin&#xff0c;本来是很简单的东西&#xff0c;但是最终导出依赖包时没注意&#xff0c;导致目标服务上始终没有纳入 Zipkin 的链路追踪中&#xff0c;本文记录这个过程及关键依赖包。 部署zipkin 官网下载最新的 zipkin 可执行包&a…

创建Asp.net MVC项目实现视图页面数据传值显示

MVC中视图传值 ViewData ViewBag TempData 举例创建三中传值方式实现页面数据展示 MVC中视图传值 Asp.net MVC中Controller向View传值有多种方式,这里简单说一下其中3种方式 ViewData、ViewBag和TempData ViewData ViewData存储数据&#xff0c;ViewData的声明和赋值方…

基于物联网的交叉口智能交通灯控制系统设计与实现

摘 要 智能视频监控技术是近年来新兴的一种利用计算机视觉技术&#xff0c;人工智能技术和数字视频处理技术对监控视频的目标进行识别&#xff0c;通过对此的分析处理&#xff0c;从而对视频监控系统进行控制&#xff0c;智能视频监控技术是一项较为复杂的课题。特别是对运动物…

代码随想录算法训练营第五十九天| 503.下一个更大元素II 42. 接雨水

文档讲解&#xff1a;代码随想录 视频讲解&#xff1a;代码随想录B站账号 状态&#xff1a;看了视频题解和文章解析后做出来了 503.下一个更大元素II class Solution:def nextGreaterElements(self, nums: List[int]) -> List[int]:res [-1] * len(nums)stack []for i in…

普中STM32 单片机资料

普中科技–各型号开发板资料下载链接: ①普中-精灵1开发板: 百度网盘链接:https://pan.baidu.com/s/1Pa8Ep1xmg6uoq17O6Nwyyw?pwd=1234 提取码:1234 ②普中-ESP32开发板: 百度网盘链接:https://pan.baidu.com/s/16VthcbW27oEWp162H3bi6Q?pwd=1234 提取码:1234 一…

Springboot 使用 阿里的 druid 连接池 启用 wall sql防火墙的情况下怎么支持多sql同时执行?

1、问题如上&#xff0c;看了不少网上的文章&#xff0c;在我这都不生效&#xff0c;网上主要的解决思路有两个。 第一个是&#xff1a;去掉配置文件中的 wall filter # 修改之前 spring.datasource.druid.filtersstat,wall,log4j# 修改之前 spring.datasource.druid.filte…

【Pytorch】Visualization of Feature Maps(5)——Deep Dream

学习参考来自&#xff1a; PyTorch实现Deep Dreamhttps://github.com/duc0/deep-dream-in-pytorch 文章目录 1 原理2 VGG 模型结构3 完整代码4 输出结果5 消融实验6 torch.norm() 1 原理 其实 Deep Dream大致的原理和【Pytorch】Visualization of Feature Maps&#xff08;1&…

一次Apollo Client升级导致的生产404 Not Found问题排查记录

概述 本文记录一次升级Apollo Client组件到1.7.0后遇到的重大生产事故。只想看结论的&#xff0c;可直接快进到文末。实际上&#xff0c;第一句话就是一个结论。 另&#xff0c;本文行文思路事后看起来可行略显思路清晰&#xff0c;实际上排查生产问题时如无头苍蝇&#xff0…

Python TypeError: int() argument must be a string, a bytes原因

int()函数的TypeError Python开发过程中&#xff0c;使用int()函数来转换或生成int类型的数据时&#xff0c;如果Python抛出并提示TypeError: int() argument must be a string, a bytes-like object or a real number, not complex&#xff0c;那么原因在于传递给int()函数的…

45、Flink 的指标体系介绍及验证(3)- 完整版

Flink 系列文章 1、Flink 部署、概念介绍、source、transformation、sink使用示例、四大基石介绍和示例等系列综合文章链接 13、Flink 的table api与sql的基本概念、通用api介绍及入门示例 14、Flink 的table api与sql之数据类型: 内置数据类型以及它们的属性 15、Flink 的ta…