JS【详解】快速排序

快速排序的时间复杂度为 O(n2)

排序流程

1、首先设定一个分界值(比如数组最中间的元素),通过该分界值将数组分成左右两部分。

2、将大于或等于分界值的数据集中到数组右边,小于分界值的数据集中到数组的左边。

3、对左侧和右侧的数据按1和2的逻辑不断执行,直至排序完成。

在这里插入图片描述

代码范例 1 — 使用 splice

 /**
         * 快速排序(使用 splice)
         * @param arr 原数组
         * @returns 排序的数组
         */
        function quickSort1(arr) {
            let length = arr.length
            if (length <= 1) return arr

            const midIndex = Math.floor(length / 2) // 中间的 index
            const midValue = arr.splice(midIndex, 1)[0] // 中间的值。splice 会修改数组
            const left = []
            const right = []

            // 注意这里使用 arr.length ,arr 被修改了
            for (let i = 0; i < arr.length; i++) {
                const n = arr[i]
                if (n < midValue) {
                    // 小于 midValue ,则放在左侧
                    left.push(n)
                } else {
                    // 大于等于 midValue ,则放在右侧
                    right.push(n)
                }
            }

            return quickSort1(left).concat(
                [midValue],
                quickSort1(right)
            )
        }

代码范例 2 — 使用 slice

/**
         * 快速排序(使用 slice)
         * @param arr 原数组
         * @returns 排序的数组
         */
        function quickSort2(arr) {
            const length = arr.length
            if (length <= 1) return arr

            const midIndex = Math.floor(length / 2) // 中间的 index
            const midValue = arr.slice(midIndex, midIndex + 1)[0] // 中间的值。注意,使用 slice,原数组没有改动

            const left = []
            const right = []

            for (let i = 0; i < length; i++) {
                if (i !== midIndex) {
                    const n = arr[i]
                    if (n < midValue) {
                        // 小于 midValue ,则放在左侧
                        left.push(n)
                    } else {
                        // 大于等于 midValue ,则放在右侧
                        right.push(n)
                    }
                }
            }

            return quickSort2(left).concat(
                [midValue],
                quickSort2(right)
            )
        }

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

项目中父模块调用子模块出现 Invalid bound statement (not found)问题

背景 做某个saas项目的时候&#xff0c;我把用户、角色、菜单、字典等模块弄成了一个基础包&#xff0c;想着如果之后又类似的项目的时候可以偷个懒 直接引用基础包就可以了。 当我引用的时候出现了这个问题 Invalid bound statement (not found):xxx 分析思路 这个问题一般…

卧式饲料搅拌机:养殖场得力助手

卧式饲料搅拌机采用卧式结构&#xff0c;设计科学合理&#xff0c;操作简便。相比传统的立式搅拌机&#xff0c;卧式搅拌机具有更大的搅拌容量和更均匀的搅拌效果。它能够轻松应对不同种类、不同比例的饲料混合需求&#xff0c;确保饲料成分的均衡分布&#xff0c;从而提高饲料…

【强化学习】DPO(Direct Preference Optimization)算法学习笔记

【强化学习】DPO&#xff08;Direct Preference Optimization&#xff09;算法学习笔记 RLHF与DPO的关系KL散度Bradley-Terry模型DPO算法流程参考文献 RLHF与DPO的关系 DPO&#xff08;Direct Preference Optimization&#xff09;和RLHF&#xff08;Reinforcement Learning f…

KMPlayer v2024.4.25.13 官方版 (万能播放器)

前言 KMPlaye通过各种插件扩展KMP可以支持层出不穷的新格式。KMPlaye强大的插件功能&#xff0c;直接从Winamp继承的插件功能&#xff0c;能够直接使用Winamp的音频&#xff0c;输入&#xff0c;视觉效果插件&#xff0c;而通过独有的扩展能力&#xff0c;只要你喜欢&#xff…

【linux-imx6ull-设备树点灯】

目录 1. 设备树简介1.1 编译-引用1.2 设备树文件结构1.3 设备树节点介绍1.3.1 特殊节点chosen 1.4 节点内容追加 2. 设备树常用OF操作函数2.1 节点寻找类2.2 属性提取类2.3 其它常用类 4. 设备树下LED实验4.1 实验简介4.2 添加LED设备节点4.3 获取设备节点并提取属性4.3.1 获取…

国内类似ChatGPT的大模型应用有哪些?发展情况如何了

第一部分&#xff1a;几个容易混淆的概念 很多人&#xff0c;包括很多粉丝的科技博主&#xff0c;经常把ChatGPT和预训练大模型混为一谈&#xff0c;因此有必要先做一个澄清。预训练大语言模型属于预训练大模型的一类&#xff0c;而ChatGPT、文心一言又是预训练大语言模型的一个…

【Linux】Linux基本指令3

目录 1.date指令 2.cal指令 3.find指令&#xff1a;&#xff08;灰常重要&#xff09; -name 4.grep指令——行文本过滤工具 5.zip/unzip指令&#xff1a; 6.tar指令&#xff08;重要&#xff09;&#xff1a;打包/解包&#xff0c;不打开它&#xff0c;直接看内容 7.bc…

SpringBoot六种API请求参数读取方式

SpringBoot六种API请求参数读取方式 同步请求和异步请求 同步: 指单线程依次做几件事异步: 指多线程同时做几件事 同步请求: 指客户端浏览器只有一个主线程, 此线程负责页面的渲染和发出请求等操作, 如果此主线程发出请求的话则停止渲染而且会清空页面显示的内容 直到服务器响…

3d渲染的常用概念和技术,渲染100邀请码1a12

之前我们介绍了3D渲染的基本原理和流程&#xff0c;这次说下几个常用概念和技术。 3D渲染中涉及到很多专业的概念和技术&#xff0c;它们决定了渲染质量和效果&#xff0c;常用的有以下几个。1、光线追踪 光线追踪是一些专业渲染器&#xff08;如V-Ray和Corona等&#xff09;…

算法思想总结:哈希表

一、哈希表剖析 1、哈希表底层&#xff1a;通过对C的学习&#xff0c;我们知道STL中哈希表底层是用的链地址法封装的开散列。 2、哈希表作用&#xff1a;存储数据的容器&#xff0c;插入、删除、搜索的时间复杂度都是O&#xff08;1&#xff09;&#xff0c;无序。 3、什么时…

Android HIDL接口添加

一.HIDL介绍 HIDL的全称是HAL interface definition language&#xff08;硬件抽象层接口定义语言&#xff09;&#xff0c;是Android Framework 与Android HAL之间的接口。HIDL 旨在用于进程间通信 (IPC)&#xff0c;进程之间的通信 采用 Binder 机制。 二.HIDL 与AIDL 的对…

客户文章|难能可贵,非模式生物的功能研究与创新

菜豆&#xff08;Phaseolus vulgaris&#xff09;&#xff0c;又名四季豆、芸豆、油豆角&#xff0c;是全球第一大豆类蔬菜&#xff0c;我国是世界上最主要的菜豆生产国和销售国。在田间生产过程中&#xff0c;菜豆常面临着各种生物和非生物逆境的胁迫&#xff0c;对其产量品质…

FOC - BLDC六步换相驱动原理

文章目录 1 . 前言2 . 电机旋转原理3 . BLDC特点4 . BLDC反电动势投影位置5 . BLDC换相时刻6 . BLDC换相注意事项7 . 小结 【全文大纲】 : https://blog.csdn.net/Engineer_LU/article/details/135149485 1 . 前言 无刷直流电机在这里区分为两种&#xff0c;一是永磁无刷直流电…

【Linux-LCD 驱动】

Linux-LCD 驱动 ■ Framebuffer 简称 fb■ LCD 驱动程序编写■ 1、LCD 屏幕 IO 配置■ 2、LCD 屏幕参数节点信息修改■ 3、LCD 屏幕背光节点信息■ 4、使能 Linux logo 显示 ■ 设置 LCD 作为终端控制台■ 1、设置 uboot 中的 bootargs■ 2、修改/etc/inittab 文件 ■ LCD 背光…

python前端streamlit模型部署

简单介绍使用前端streamlit框架快速部署本地模型&#xff1a; 1、模型训练&#xff1a; import pandas as pd # 流程整合 from sklearn.pipeline import make_pipeline, Pipeline # 数据处理 from sklearn.impute import SimpleImputer from sklearn.preprocessing import Min…

探索 Android Studio 中的 Gemini:加速 Android 开发的新助力

探索 Android Studio 中的 Gemini&#xff1a;加速 Android 开发的新助力 在 Gemini 时代的下一篇章中&#xff0c;Gemini融入了更多产品中&#xff0c;Android Studio 正在使用 Gemini 1.0 Pro 模型&#xff0c;使 Android 开发变得更快、更简单。 Studio Bot 现已更名为 And…

深度学习知识与心得

目录 深度学习简介 传统机器学习 深度学习发展 感知机 前馈神经网络 前馈神经网络&#xff08;BP网络&#xff09; 深度学习框架讲解 深度学习框架 TensorFlow 一个简单的线性函数拟合过程 卷积神经网络CNN&#xff08;计算机视觉&#xff09; 自然语言处理NLP Wo…

C# WinForm —— 23 Timers.Timer 组件介绍与使用

1. 简介 System.Timers.Timer 计时器 轻量 每隔一段时间触发Elapsed事件&#xff0c;执行操作(不是由UI线程执行的)&#xff0c;即使事件中执行了比较耗时的操作&#xff0c;也不会造成 UI 失去响应 如果要获取服务器的计时功能的话&#xff0c;可以使用System.Timers.Timer …

unity2020打包webGL时卡进程问题

我使用的2020.3.0f1c1&#xff0c;打包发布WEB版的时候会一直卡到asm2wasm.exe这个进程里&#xff0c;而且CPU占用率90%以上。 即使是打包一个新建项目的空场景也是同样的问题&#xff0c;我尝试过一直卡在这里会如何&#xff0c;结果还真打包成功了。只是打包一个空场景需要20…

C++(入门基础版本)

1&#xff0c;什么是C C 是一种通用的、面向对象的编程语言&#xff0c;是 C 语言的一个超集&#xff0c;也就是说&#xff0c;任何有效的 C 程序都是有效的 C 程序。C 通过添加诸如类和对象、继承和多态等概念&#xff0c;扩展了 C 语言的功能&#xff0c;使其更适用于大型软…