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.mzph.cn/diannao/2276.shtml

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

相关文章

笔试题1 -- 吃掉字符串中相邻的相同字符(点击消除_牛客网)

吃掉字符串中相邻的相同字符 文章目录 吃掉字符串中相邻的相同字符题目重现解法一&#xff1a;(基于 erase() 函数实现)解法二&#xff1a;&#xff08;利用 栈 辅助实现&#xff09;总结 题目链接&#xff1a; 点击消除_牛客网 题目重现 牛牛拿到了一个字符串。 他每次“点击…

XOR 校验算法

XOR 校验算法&#xff08;XOR checksum algorithm&#xff09;是一种简单的校验算法&#xff0c;用于检测数据传输中的错误。 该算法的基本原理是将数据中的所有位进行异或运算&#xff0c;然后生成一个检验值。发送方将数据和检验值一起发送给接收方&#xff0c;接收方再次对接…

(数据结构代码,总结,自我思考)=> { return 个人学习笔记; } 【To be continued~】

俗话说 “学而不思则罔”&#xff0c;是时候复习和整理一下自己先前的学习历程了&#xff01; Chapter-One 《BinarySearch》 public static int binarySearch (int[] a, int target) {int i 0, j a.length - 1;while (i < j) {int m (i j) >>> 1; // 求中位…

jsp实验10 JavaBean

二、实验项目内容&#xff08;实验题目&#xff09; 编写代码&#xff0c;掌握javabean的用法。【参考课本 上机实验 5.5.1 】 三、源代码以及执行结果截图&#xff1a; 源代码&#xff1a; Fraction.java package sea.water; public class Fraction { public double numbe…

直面ES6中的Proxy和Reflect,发现很简单

ES6对于今天来说&#xff0c;已经不算是一个很新的概念。从2015年第一版ES6发版之后&#xff0c;每一年都有新的版本产生&#xff0c;新版本是该年正式版本的语言标准。因此&#xff0c;ES6 既是一个历史名词&#xff0c;也是一个泛指&#xff0c;含义是 5.1 版以后的 JavaScri…

mysql和Nosql到底有什么区别,分别应用与什么场景?

MySQL 和 NoSQL 是两种不同类型的数据库技术&#xff0c;它们各有其特点和适用场景。了解它们之间的区别和应用场景可以帮助选择合适的技术来支持特定的应用需求。 MySQL MySQL 是一种关系数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;它使用结构化查询语言&…

Linux打开html

在 Linux 系统中&#xff0c;您可以使用默认的 Web 浏览器打开 HTML 文件。一般来说&#xff0c;您可以采用以下两种方式打开 HTML 文件&#xff1a; 使用终端命令行打开 HTML 文件 打开终端并进入到 HTML 文件所在目录&#xff0c;然后输入以下命令&#xff1a; xdg-open f…

类和对象(2)——封装(封装的概念、包、staic)

前言 面向对象程序三大特性&#xff1a;封装、继承、多态。而类和对象阶段&#xff0c;主要研究的就是封装特性。何为封装呢&#xff1f;简单来说就是套壳屏蔽细节。 一、什么是封装 1.1 概念 将数据和操作数据的方法进行有机结合&#xff0c;隐藏对象的属性和实现细节&…

ASGI Server之hypercorn

官方文档 简介 产生背景 Hypercorn最初是Quart(一款异步python微框架)的一部分&#xff0c;后来被分离成一个独立的ASGI服务器。Hypercorn从Quart的0.5.0版本分叉。 结构 Hypercorn是一款基于sans-io hyper、h11、h2和wsproto库的ASGI网络服务器&#xff0c;其灵感来自Gun…

零元购与消费增值:电商新商业模式的探索与实践

大家好&#xff0c;我是微三云周丽&#xff0c;今天给大家分析当下市场比较火爆的商业模式&#xff01; 小编今天跟大伙们分享什么是零元购与消费增值模式&#xff1f; 在数字化浪潮的推动下&#xff0c;电商行业正经历着qian所未有的变革。传统的ying销ce略逐渐失去效力&…

有关栈的练习

栈练习1 给定一个栈&#xff08;初始为空&#xff0c;元素类型为整数&#xff0c;且小于等于 109&#xff09;&#xff0c;只有两个操作&#xff1a;入栈和出栈。先给出这些操作&#xff0c;请输出最终栈的栈顶元素。 操作解释&#xff1a; 1 表示将一个数据元素入栈&#xff…

webmagic 爬取https的网站抛avax.net.ssl.SSLHandshakeException异常

webmagic 抓取带有https的网站&#xff0c;抛出的异常javax.net.ssl.SSLHandshakeException。 初步解决办法&#xff1a; 1,在自己的项目中新建httpclient文件夹&#xff0c;新建类HttpClientGenerator, 复制webmagic源码中的 HttpClientGenerator. 2.修改 HttpClientGenerator…

Baumer工业相机堡盟工业相机如何通过NEOAPISDK实现相机资源的正确释放(C#)

Baumer工业相机堡盟工业相机如何通过NEOAPISDK实现相机资源的正确释放&#xff08;C#&#xff09; Baumer工业相机Baumer工业相机NEOAPI SDK和相机资源释放的技术背景Baumer工业相机通过NEOAPISDK实现相机资源释放功能1.引用合适的类文件2.通过NEOAPISDK实现相机资源释放 Baume…

书生浦语训练营第2期-第5节作业

一、基础作业 1.1 LMDeploy环境部署 &#xff08;1&#xff09;创建conda环境 studio-conda -t lmdeploy -o pytorch-2.1.2 &#xff08;2&#xff09;安装Lmdeploy 激活刚刚创建的虚拟环境。 conda activate lmdeploy 安装0.3.0版本的lmdeploy。 pip install lmdeploy[all]0…

达梦(DM)数据库表索引

达梦DM数据库表索引 表索引索引准则其他准则 创建索引显式地创建索引其他创建索引语句 使用索引重建索引删除索引 表索引 达梦数据库表索引相关内容比较多&#xff0c;常用的可能也就固定的一些&#xff0c;这里主要说一下常用的索引&#xff0c;从物理存储角度进行分类&#…

傅立叶变换与拉普拉斯变换的区别与联系?

傅里叶变换和拉普拉斯变换都是信号处理中的重要工具&#xff0c;它们有以下几个主要区别&#xff1a; 定义域&#xff1a;傅里叶变换是在频率域&#xff08;即虚轴&#xff09;上定义的&#xff0c;而拉普拉斯变换在复平面上的特定区域内定义。 适用范围&#xff1a;傅里叶变换…

在线测径仪的六类测头组合形式!哪种适合你?

在线测径仪&#xff0c;这一现代工业的精密仪器&#xff0c;犹如一位技艺高超的工匠&#xff0c;以其卓越的性能和精准度&#xff0c;为工业生产提供了坚实的保障。它的出现&#xff0c;不仅提高了生产效率&#xff0c;更保证了产品质量&#xff0c;为企业的可持续发展注入了强…

基于JavaWeb开发的springboot网约车智能接单规划小程序[附源码]

基于JavaWeb开发的springboot网约车智能接单规划小程序[附源码] &#x1f345; 作者主页 央顺技术团队 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; &#x1f345; 查看下方微信号获取联系方式 承接各种…

SLICEM是如何将查找表配置为分布式RAM/移位寄存器的

1.首先说SliceM和SliceL如何配置为ROM的 一个SLICE包含4个六输入查找表&#xff0c;因此每个查找表就能存储64bit的数据&#xff0c;要实现128bit的ROM&#xff0c;只需要通过两个LUT就可实现&#xff0c;具体如下表: 2.如何配置成为分布式RAM SLICEM中的LUT如下图&#xff…

华为OD机试真题-欢乐的周末-2024年OD统一考试(C卷)

题目描述: 小华和小为是很要好的朋友,他们约定周末一起吃饭。通过手机交流,他们在地图上选择了多个聚餐地点(由于自然地形等原因,部分聚餐地点不可达),求小华和小为都能到达的聚餐地点有多少个? 输入描述: 第一行输入m和n,m代表地图的长度,n代表地图的宽度。 第二行…