js的算法-交换排序(快速排序)

快速排序

基本思想

快速排序的基本思想是基于分治法的:在待排序表L【1...n】中任意取一个元素p 作为枢轴(或基准,通常取首元素)。通过一趟排序将待排序表划分为独立的两部分L【1...k-1】和L【k+1...n】;这样的话,L【1...k-1】中所有的元素小于p,L【k+1...n】中所有的元素大于等于p,p 放在了整个待排序表排好序的最终位置上。也就是p 的顺序已经排好。 左边全是比p 小的,右面全是比p 大的。这个过程称为一趟快速排序(或一次划分)。然后分别递归对两个子表,重复上述过程。直至每部分内只有一个元素或空为止。此时,所有的元素都放在了其最终的位置上。

一趟快速排序的过程是一个交替搜索和交换的过程。

演示

第一趟

js 代码

let ary = [3, 8, 1, 9, 4, 5, 6, 2, 7];
let len = ary.length;
let p = ary[len - 1];
console.log("p", p);const left = [];
const right = [];for (let i = 0; i < len - 1; i++) {if (ary[i] < p) {left.push(ary[i]);} else {right.push(ary[i]);}
}
let result = left.concat(p, right);
console.log(JSON.stringify(result));

运行结果:

p 7
[3,1,4,5,6,2,7,8,9]

代码展示

console.log("******递归实现快速排序******");
let ary = [3, 8, 1, 9, 4, 5, 6, 2, 7];
function quickSort(ary) {// 如果数组长度小于等于1,直接返回if (ary.length <= 1) {return ary;}// 如果数组长度大于1,则取最后一个元素为基准值let p = ary[ary.length - 1];const left = [];const right = [];// 遍历给左右分区for (let i = 0; i < ary.length - 1; i++) {if (ary[i] < p) {// 小于的放在左边left.push(ary[i]);} else {// 大于的放在右边right.push(ary[i]);}}// 注意递归return quickSort(left).concat(p, quickSort(right));
}
const result1 = quickSort(ary);
console.log(JSON.stringify(result1));

结果:

******递归实现快速排序******
[1,2,3,4,5,6,7,8,9]

性能分析

性能分析
时间复杂度空间复杂度
最好情况:O(nlogn),)每次取到的元素都刚好平分平分整个数组最好情况:O(logn)每次取到的元素都刚好平分平分整个数组
最坏情况O(n^2)每次取到的元素就是数组中最小/最大的,同冒泡排序最坏情况:O(n) 每次取到的元素就是数组中最小/最大的,同冒泡排序
平均情况:O(nlogn)平均情况:O(logn);因为用到了递归,每次递归都必须使用栈

总结:

1. 空间复杂度:因为快速排序是递归的,需要借助一个递归工作栈来保存每层递归调用的必要信息,其容量应该与递归调用的最大深度一致。

2. 如何提升算法效率?

方法1:尽量选取一个可以将数据中分的枢轴元素,如果从序列的头,尾,及中间选取3个元素,再去这三个元素的中间值作为最终的枢轴元素;

方法2. 随机的从当前表中选取枢轴元素

2种做法都可以使得最坏情况在实际排序中几乎不会发生。

3. 快速排序是所有内部排序算法中平均性能最优的排序算法。

4. 稳定性:在划分算法中,如果右端区间有两个关键字相同,都小于枢轴,那么在交换到左端取件后,他们的相对位置会发生变化;也就是说快速排序是一种不稳定的排序方法。

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

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

相关文章

【视觉论文】VIT - Vision Transformers

论文&#xff1a;AN IMAGE IS WORTH 16X16 WORDS: TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE 链接&#xff1a;https://arxiv.org/abs/2010.11929 很多人博主都写烂了的论文&#xff0c;我到现在才真正翻开论文看&#xff0c;21年的工作&#xff0c;正好是刚毕业那年&…

分析 MyBatis/MyBatis-Plus 慢 SQL 的分析组件 --SQL 慢镜️‍♀️

大家好&#xff01;我是聪ζ&#x1f331;我做了一个分析 MyBatis/MyBatis-Plus 慢 SQL 的分析组件 --SQL 慢镜&#x1f575;️‍♀️ GitHub仓库地址&#x1f680;: https://github.com/lhccong/sql-slow-mirror 点点 star 我的朋友们✨ 背景&#x1f9ca;&#xff1a; 大家…

使用autocannon和0x对网站进行性能分析(node)

npm i autocannon -g autocannon -c 100 -d 5 -p 10 http://localhost:3000/ 0x -o app.js 火焰图是根据程序的栈的状态对出现函数的采样数据统计而得&#xff0c;宽度代表函数运行一次所需的时长、高度代表栈的层数、颜色深度代表函数在采样中出现的频率&#xff0c;因此宽度…

Python-GEE遥感云大数据分析、管理与可视化

原文链接&#xff1a;Python-GEE遥感云大数据分析、管理与可视化https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247601238&idx2&sn6b0557cf61451eaff65f025d648da869&chksmfa820db1cdf584a76de953b96519704177e6206d4ecd47a2f2fabbcac2f7ea619b0bce184…

标准版/开源版 移动端新增页面使用文档

在标准版开发的实际使用中&#xff0c;随着用户移动端的产品和信息内容不断增多&#xff0c;新增页面来展示对应的产品详情、模块等内容。针对一些概念或者步骤较多的内容&#xff0c;可以新增子页面构建多级模块结构&#xff0c;帮助用户快速定位。 下面就如何新增页面做一讲…

2024深圳杯数学建模挑战赛B题:批量工件并行切割下料问题思路代码成品论文分析

更新完整代码和成品完整论文 《2024深圳杯&东三省数学建模思路代码成品论文》↓↓↓ https://www.yuque.com/u42168770/qv6z0d/zx70edxvbv7rheu7?singleDoc# 问题重述 深圳杯数学建模挑战赛2024B题&#xff1a;批量工件并行切割下料问题 板材切割下料是工程机械领域重要…

qmt教程1---qmt安装,提供下载链接

以前写的qmt不太完善现在重新好好的学习一下qmt&#xff0c;重新封装qmt&#xff0c;使用方便 1第一步下载qmt 点击安装 下一步 下一步 默认路径&#xff0c;安装完成 2登录qmt&#xff0c;选择行情加交易&#xff0c;选择极简模式 登录情况 我把qmt上线了 比如我们获取一分钟…

利用ollama和open-webui本地部署通义千问Qwen1.5-7B-Chat模型

目录 1 安装ollama 2 安装open-webui 2.1 镜像下载 3 配置ollama的模型转换工具环境 3.1 下载ollama源码 3.2 下载ollama子模块 3.3 创建ollama虚拟环境 3.4 安装依赖 3.5 编译量化工具 7 创建ollama模型 8 运行模型 参考文献&#xff1a; 1 安装ollama curl -fsSL …

算法训练营day15

一、层序遍历 参考链接7.2 二叉树遍历 - Hello 算法 (hello-algo.com) 层序遍历本质上属于广度优先遍历&#xff0c;也称广度优先搜索&#xff0c; BFS通常借助队列的先入先出的特性实现 参考链接102. 二叉树的层序遍历 - 力扣&#xff08;LeetCode&#xff09; 像这种较为…

2SD1666 封装TO-220F 实物拍摄 功能介绍

2SD1666 是一款 NPN 硅晶体管&#xff0c;适合于低频和音频放大以及开关应用。以下是它的主要功能和参数的详细介绍&#xff1a;功能:低频放大: 适用于音频放大器和其他低频放大应用。 开关: 可用于电源开关和电机控制等应用。 主要参数:极限工作电压 (VCEO): 60V 最大电流允许…

MySQL的创建用户以及用户权限

使用语言 MySQL 使用工具 Navicat Premium 16 代码能力快速提升小方法&#xff0c;看完代码自己敲一遍&#xff0c;十分有用 拖动表名到查询文件中就可以直接把名字拉进来中括号&#xff0c;就代表可写可不写 目录 1.创建用户 1.1 工具创建用户 1.2 脚本创建用户 1.2.…

一文带你掌握yaml文件的使用

在自动化测试数据存储中&#xff0c;比较常见的有csv、json、excel文件等&#xff0c;可能大家忽略了另外一个非常简单、好用的&#xff0c;而且更简洁的文件&#xff0c;那就是咱们今天的主角yaml文件。 yaml文件是一种数据序列化语言&#xff0c;其良好的跨语言、跨平台、易…