当前位置: 首页 > news >正文

三天精通一算法之快速排序

力扣链接912. 排序数组 - 力扣(LeetCode)注意这题快排不能用递归,否则堆会爆

快速排序(Quicksort)是一种高效的排序算法,通常使用分治法来将一个列表分成较小的子列表,然后递归地排序这些子列表。以下是用 JavaScript 实现快速排序的几种方式:

### 方法一:标准递归实现

```javascript
function quickSort(arr) {
    // 如果数组长度小于等于1,则直接返回(已排序)
    if (arr.length <= 1) {
        return arr;
    }

    // 选择基准元素(这里选择中间元素)
    const pivotIndex = Math.floor(arr.length / 2);
    const pivot = arr[pivotIndex];

    // 定义左右两个数组
    const left = [];
    const right = [];

    // 遍历数组(跳过基准元素),根据与基准元素的比较结果放入left或right
    for (let i = 0; i < arr.length; i++) {
        if (i === pivotIndex) continue; // 跳过基准元素
        if (arr[i] < pivot) {
            left.push(arr[i]);
        } else {
            right.push(arr[i]);
        }
    }

    // 递归调用quickSort并合并结果
    return [...quickSort(left), pivot, ...quickSort(right)];
}

// 示例使用
const unsortedArray = [3, 6, 8, 10, 1, 2, 1];
console.log(quickSort(unsortedArray)); // 输出: [1, 1, 2, 3, 6, 8, 10]
```

### 方法二:原地排序(in-place)

这种方法不需要额外的空间来存储 `left` 和 `right` 数组,而是通过交换元素在原数组上进行排序。

```javascript
function quickSortInPlace(arr, left = 0, right = arr.length - 1) {
    if (left >= right) {
        return arr;
    }

    // 分区函数,返回分区点索引
    function partition(arr, left, right) {
        const pivot = arr[right]; // 选择最右边的元素作为基准
        let i = left;

        for (let j = left; j < right; j++) {
            if (arr[j] <= pivot) {
                [arr[i], arr[j]] = [arr[j], arr[i]]; // 交换
                i++;
            }
        }

        // 将基准元素放到正确的位置
        [arr[i], arr[right]] = [arr[right], arr[i]];
        return i;
    }

    // 获取分区点
    const pivotIndex = partition(arr, left, right);

    // 递归对左右两部分进行排序
    quickSortInPlace(arr, left, pivotIndex - 1);
    quickSortInPlace(arr, pivotIndex + 1, right);

    return arr;
}

// 示例使用
const unsortedArray = [3, 6, 8, 10, 1, 2, 1];
console.log(quickSortInPlace(unsortedArray)); // 输出: [1, 1, 2, 3, 6, 8, 10]
```

### 方法三:随机化快速排序

为了减少最坏情况的发生概率(例如当输入已经是排序好的数组时),可以选择一个随机的基准元素来进行分区。

```javascript
function quickSortRandomized(arr, left = 0, right = arr.length - 1) {
    if (left >= right) {
        return arr;
    }

    function partition(arr, left, right) {
        const randomPivotIndex = Math.floor(Math.random() * (right - left + 1)) + left;
        [arr[randomPivotIndex], arr[right]] = [arr[right], arr[randomPivotIndex]]; // 交换随机基准到末尾

        const pivot = arr[right];
        let i = left;

        for (let j = left; j < right; j++) {
            if (arr[j] <= pivot) {
                [arr[i], arr[j]] = [arr[j], arr[i]]; // 交换
                i++;
            }
        }

        [arr[i], arr[right]] = [arr[right], arr[i]]; // 将基准元素放到正确的位置
        return i;
    }

    const pivotIndex = partition(arr, left, right);

    quickSortRandomized(arr, left, pivotIndex - 1);
    quickSortRandomized(arr, pivotIndex + 1, right);

    return arr;
}

// 示例使用
const unsortedArray = [3, 6, 8, 10, 1, 2, 1];
console.log(quickSortRandomized(unsortedArray)); // 输出: [1, 1, 2, 3, 6, 8, 10]
```

这三种方法展示了不同的快速排序实现方式。第一种是最简单的递归实现,第二种是更高效的原地排序,而第三种则是引入了随机化以提高性能稳定性。你可以根据具体需求选择最适合的方法。

相关文章:

三天精通一算法之快速排序

力扣链接912. 排序数组 - 力扣&#xff08;LeetCode&#xff09;注意这题快排不能用递归&#xff0c;否则堆会爆 快速排序&#xff08;Quicksort&#xff09;是一种高效的排序算法&#xff0c;通常使用分治法来将一个列表分成较小的子列表&#xff0c;然后递归地排序这些子列表…...

互联网、物联网的相关标准

互联网的相关标准 网络通信协议&#xff1a; HTTP&#xff08;Hypertext Transfer Protocol&#xff09;&#xff1a;用于在网络中传输文本、图像、音频和视频等数据的协议。它基于请求-响应模型&#xff0c;客户端发送请求给服务器&#xff0c;服务器返回响应。HTTPS&a…...

Linux题库及答案

填空题 1. 建立用户账号的命令是__useradd________。 2. 修改账号密码的命令是__passwd________。 3. 更改用户密码过期信息的命令是__chage________。 4. 创建一个新组的命令是___groupadd_______。 5. 用于在不注销的情况下切换到系统中的另一个用户的命令是___su_…...

Android 镜像模式和扩展模式区别探讨-Android14

Android 镜像模式和扩展模式区别探讨 1、区分镜像模式和扩展模式1.1 扩展屏是否有显示内容1.2 镜像模式显示条件 2、镜像模式界面 同屏显示和异屏显示探讨DisplayManagerService启动及主屏添加-Android13 Android主副屏显示-Android14 1、区分镜像模式和扩展模式 LogicalDispla…...

深度学习笔记之BERT(五)TinyBERT

深度学习笔记之TinyBERT 引言回顾&#xff1a;DistilBERT模型TinyBERT模型结构TinyBERT模型策略Transformer层蒸馏嵌入层蒸馏预测层蒸馏 TinyBERT模型的训练效果展示 引言 上一节介绍了 DistilBERT \text{DistilBERT} DistilBERT模型&#xff0c;本节将继续介绍优化性更强的知…...

【时间序列预测】基于PyTorch实现CNN_BiLSTM算法

文章目录 1. CNN与BiLSTM2. 完整代码实现3. 代码结构解读3.1 CNN Layer3.2 BiLSTM Layer3.3 Output Layer3.4 forward Layer 4. 应用场景5. 总结 本文将详细介绍如何使用Pytorch实现一个结合卷积神经网络&#xff08;CNN&#xff09;和双向长短期记忆网络&#xff08;BiLSTM&am…...

联想Y7000 2024版本笔记本 RTX4060安装ubuntu22.04双系统及深度学习环境配置

目录 1..制作启动盘 2.Windows 磁盘分区,删除原来ubuntu的启动项 3.四个设置 4.安装ubuntu 5.ubuntu系统配置 1..制作启动盘 先下载镜像文件,注意版本对应。Rufus - 轻松创建 USB 启动盘 用rufus制作时,需要注意选择正确的分区类型和系统类型。不然安装的系统会有问题…...

VuePress学习

1.介绍 VuePress 由两部分组成&#xff1a;第一部分是一个极简静态网站生成器 (opens new window)&#xff0c;它包含由 Vue 驱动的主题系统和插件 API&#xff0c;另一个部分是为书写技术文档而优化的默认主题&#xff0c;它的诞生初衷是为了支持 Vue 及其子项目的文档需求。…...

一次“okhttp访问间隔60秒,提示unexpected end of stream“的问题排查过程

一、现象 okhttp调用某个服务&#xff0c;如果第二次访问间隔上一次访问时间超过60s&#xff0c;返回错误&#xff1a;"unexpected end of stream"。 二、最终定位原因&#xff1a; 空闲连接如果超过60秒&#xff0c;服务端会主动关闭连接。此时客户端恰巧访问了这…...

SQL最佳实践:避免使用COUNT=0

如果你遇到类似下面的 SQL 查询&#xff1a; SELECT * FROM customer c WHERE 0 (SELECT COUNT(*)FROM orders oWHERE o.customer_id c.customer_id);意味着有人没有遵循 SQL 最佳实践。该语句的作用是查找没有下过订单的客户&#xff0c;其中子查询使用了 COUNT 函数统计客…...

PG与ORACLE的差距

首先必须是XID 64&#xff0c;一个在极端环境下会FREEZE的数据库无论如何都无法承担关键业务系统的重任的&#xff0c;我们可以通过各种配置&#xff0c;提升硬件的性能&#xff0c;通过各种IT管控措施来尽可能避免在核心系统上面临FREEZE的风险&#xff0c;不过并不是每个企业…...

树莓派3B+驱动开发(2)- LED驱动(传统模式)

github主页&#xff1a;https://github.com/snqx-lqh 本项目github地址&#xff1a;https://github.com/snqx-lqh/RaspberryPiDriver 本项目硬件地址&#xff1a;https://oshwhub.com/from_zero/shu-mei-pai-kuo-zhan-ban 欢迎交流 笔记说明 如我在驱动开发总览中说的那样&…...

超详细搭建PhpStorm+PhpStudy开发环境

刚开始接触PHP开发&#xff0c;搭建开发环境是第一步&#xff0c;网上下载PhpStorm和PhpStudy软件&#xff0c;怎样安装和激活就不详细说了&#xff0c;我们重点来看一看怎样搭配这两个开发环境。 前提&#xff1a;现在假设你已经安装完PhpStorm和PhpStudy软件。 我的PhpStor…...

分析比对vuex和store模式

在 Vue 中&#xff0c;Vuex 和 store 模式 是两个不同的概念&#xff0c;它们紧密相关&#xff0c;主要用于管理应用的状态。下面我会详细介绍这两个概念&#xff0c;并通过例子帮助你更好地理解。 1. Vuex 是什么&#xff1f; Vuex 是 Vue.js 的一个状态管理库&#xff0c;用…...

C# 网络编程--基础核心内容

在现今软件开发中&#xff0c;网络编程是非常重要的一部分&#xff0c;本文简要介绍下网络编程的概念和实践。 C#网络编程的主要内容包括以下几个方面‌&#xff1a; : 上图引用大佬的图&#xff0c;大家也关注一下&#xff0c;有技术有品质&#xff0c;有国有家&#xff0c;情…...

【C++游戏程序】easyX图形库还原游戏《贪吃蛇大作战》(三)

承接上一篇文章&#xff1a;【C游戏程序】easyX图形库还原游戏《贪吃蛇大作战》&#xff08;二&#xff09;&#xff0c;我们这次来补充一些游戏细节&#xff0c;以及增加吃食物加长角色长度等设定玩法&#xff0c;也是本游戏的最后一篇文章。 一.玩家边界检测 首先是用来检测…...

uni-app H5端使用注意事项 【跨端开发系列】

&#x1f517; uniapp 跨端开发系列文章&#xff1a;&#x1f380;&#x1f380;&#x1f380; uni-app 组成和跨端原理 【跨端开发系列】 uni-app 各端差异注意事项 【跨端开发系列】uni-app 离线本地存储方案 【跨端开发系列】uni-app UI库、框架、组件选型指南 【跨端开…...

SpringBoot中的@Configuration注解

在Spring Boot中&#xff0c;Configuration注解扮演着非常重要的角色&#xff0c;它是Spring框架中用于定义配置类的一个核心注解。以下是Configuration注解的主要作用&#xff1a; 定义配置类&#xff1a; 使用Configuration注解的类表示这是一个配置类&#xff0c;Spring容器…...

十二、路由、生命周期函数

router路由 页面路由指的是在应用程序中实现不同页面之间的跳转,以及数据传递。通过 Router 模块就可以实现这个功能 2.1创建页面 之前是创建的文件,使用路由的时候需要创建页面,步骤略有不同 方法 1:直接右键新建Page(常用)方法 2:单独添加页面并配置2.1.1直接右键新建…...

【蓝桥杯每日一题】X 进制减法

X 进制减法 2024-12-6 蓝桥杯每日一题 X 进制减法 贪心 进制转换 题目大意 进制规定了数字在数位上逢几进一。 XX 进制是一种很神奇的进制, 因为其每一数位的进制并不固定&#xff01;例如说某 种 XX 进制数, 最低数位为二进制, 第二数位为十进制, 第三数位为八进制, 则 XX 进制…...

Windows下MySQL 8.0数据库存储路径迁移实战:释放C盘空间

Windows下MySQL 8.0存储路径迁移全指南&#xff1a;彻底解放C盘空间 对于长期在本地开发环境中使用MySQL的开发者来说&#xff0c;系统盘空间被数据库文件逐渐蚕食是常见痛点。默认安装的MySQL 8.0会将数据目录存放在C盘的隐蔽位置&#xff0c;随着业务数据增长&#xff0c;不仅…...

Uvicorn与Scaleway Serverless Functions:无服务器Python应用部署终极指南

Uvicorn与Scaleway Serverless Functions&#xff1a;无服务器Python应用部署终极指南 【免费下载链接】uvicorn An ASGI web server, for Python. &#x1f984; 项目地址: https://gitcode.com/GitHub_Trending/uv/uvicorn Uvicorn作为Python生态中最快、最现代的ASGI…...

HunyuanVideo-Foley开发者指南:API封装、批量生成与二次开发接口详解

HunyuanVideo-Foley开发者指南&#xff1a;API封装、批量生成与二次开发接口详解 1. 镜像概述与环境准备 1.1 核心功能与硬件要求 HunyuanVideo-Foley是一款集视频生成与AI音效生成于一体的专业工具&#xff0c;本镜像针对RTX 4090D 24GB显卡进行了深度优化。主要功能包括&a…...

单轴晶体中的偏振转换

摘要 当线偏振光聚焦并通过单轴晶体传播时&#xff0c;即使沿着光轴方向&#xff0c;不同的偏振分量之间也可能会发生复杂的转换。这种现象可以应用于例如产生涡旋光。以方解石晶体为例&#xff0c;这个用例在VirtualLab Fusion中证明了单轴晶体中的偏振转换。并且可以观察到…...

YOLOv13环境配置(cpu版)

提前安装好Anaconda 和pycharm。第一步&#xff1a;打开Anaconda prompt输入&#xff1a;conda create -n yolo13cpu python3.11意为安装名为 yolo13cpu&#xff0c;python版本为3.11的基础环境&#xff0c;如下图所示&#xff0c;表示安装成功&#xff1a;第二步&#xff1a;使…...

付费墙绕过工具深度解析:技术原理与合规使用指南

付费墙绕过工具深度解析&#xff1a;技术原理与合规使用指南 【免费下载链接】bypass-paywalls-chrome-clean 项目地址: https://gitcode.com/GitHub_Trending/by/bypass-paywalls-chrome-clean 在数字内容付费模式日益普及的今天&#xff0c;如何在尊重知识产权的前提…...

深度学习训练中loss震荡与不收敛的常见原因及实战调优策略

1. 为什么你的模型loss像过山车&#xff1f;先看懂这些典型症状 第一次打开TensorBoard看到自己的loss曲线像心电图一样上蹿下跳&#xff0c;那种感觉就像新手司机开车时方向盘失控。其实loss震荡和不收敛是深度学习中再常见不过的问题&#xff0c;但不同表现背后藏着完全不同的…...

5G NR物理层实战:如何利用TS 38.211优化无线资源管理

5G NR物理层实战&#xff1a;TS 38.211无线资源管理优化指南 在5G网络部署的深水区&#xff0c;无线资源管理&#xff08;RRM&#xff09;的精细化程度直接决定了网络性能天花板。作为3GPP物理层协议集的核心文档&#xff0c;TS 38.211规范中隐藏着诸多未被充分挖掘的优化密钥—…...

机器视觉中的坐标系转换:从像素到世界的无缝衔接

1. 机器视觉中的坐标系基础概念 第一次接触机器视觉时&#xff0c;最让我困惑的就是各种坐标系之间的关系。记得当时调试工业相机时&#xff0c;明明在图像上看到了目标物体&#xff0c;但机械臂就是抓不准位置。后来才发现&#xff0c;问题出在没有正确理解像素坐标系和世界坐…...

TensorRT性能调优实战指南:从瓶颈诊断到引擎优化

TensorRT性能调优实战指南&#xff1a;从瓶颈诊断到引擎优化 【免费下载链接】TensorRT NVIDIA TensorRT™ 是一个用于在 NVIDIA GPU 上进行高性能深度学习推理的软件开发工具包&#xff08;SDK&#xff09;。此代码库包含了 TensorRT 的开源组件 项目地址: https://gitcode.…...