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://xiahunao.cn/news/2981103.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

数据结构 第六章 树与二叉树(二)

&#x1f680; 【考纲要求】二叉树的定义及其主要特征&#xff1b;二叉树的顺序存储和链式存储 二、二叉树的概念 1&#xff09;什么是二叉树&#xff1f; 对于二叉树来说&#xff0c;它是一个特殊的树形结构&#xff0c;其每个节点都最多有两个孩子&#xff08;即节点的度最…

Redis入门到通关之Redis数据结构-Hash篇

文章目录 ☃️ 概述☃️底层实现☃️源码☃️其他 欢迎来到 请回答1024 的博客 &#x1f353;&#x1f353;&#x1f353;欢迎来到 请回答1024的博客 关于博主&#xff1a; 我是 请回答1024&#xff0c;一个追求数学与计算的边界、时间与空间的平衡&#xff0c;0与1的延伸的后…

ESP-IDF下载与安装完整流程

本文主要看参考官网说明&#xff0c;如下&#xff1a; Windows 平台工具链的标准设置 - ESP32 - — ESP-IDF 编程指南 latest 文档 (espressif.com) 一、概述 ESP-IDF需要安装一些必备工具&#xff0c;才能围绕ESP32构建固件&#xff0c;包括&#xff1a; PythonGit交叉编译…

圈子交友系统话题设置-免费圈子社区论坛交友系统-圈子交友系统功能介绍-APP小程序H5多端源码交付!

1. 圈子的独特创造与精心管理 源码赋予用户创造独特圈子的能力&#xff0c;为志同道合的人们打造一个分享兴趣、交流见解的平台。每个圈子都可以个性化定制主题、标签和规则&#xff0c;以确保圈子具备个性特点和强烈的社群感。作为圈子的创建者&#xff0c;您将享有自由编辑资…

LabVIEW专栏八、类

该章目的是可以开发仪器类。 一、类的概述 一般来说类有三大特性&#xff0c;封装&#xff0c;继承和多态。 在实际项目中&#xff0c;最主要是继承和多态&#xff0c;要搞清楚这两者的概念和在LabVIEW中是怎样应用的。在LabVIEW中&#xff0c;面向对象编程用到的就是LabVIE…

基于高斯混合模型的视频背景提取和人员跟踪算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 MATLAB2013B 3.部分核心程序 .............................................................................. %我们这里…

利用大模型与AI Agent,实现企业数据智能分析

导语&#xff1a;大模型爆火之后&#xff0c;很多企业也用大模型做了相关探索和实践&#xff0c;我们发现大模型解决单点问题时效果更好。但同时会产生安全、幻想等相关问题。今天从传统数据分析的痛点&#xff0c;到大模型智能分析的建设方式&#xff0c;并结合相关实践案例&a…

OpenHarmony实战开发-合理运行后台任务

简介 设备返回主界面、锁屏、应用切换等操作会使应用退至后台。为了降低设备耗电速度、保障用户使用流畅度&#xff0c;系统会对退至后台的应用进行管控&#xff0c;包括进程挂起和进程终止。为了保障后台音乐播放、日历提醒等功能的正常使用&#xff0c;系统提供了受规范约束…

安全AI未来 | C3安全大会 · 2024,数据驱动 AI原生

数字为时代变革注入动力&#xff0c;AI为重塑社会文明带来原力。数智浪潮中&#xff0c;我们见证着时代跃迁的巨变&#xff0c;面临着适变、应变、驭变的挑战。 数字驱动、AI原生。数字的流动不仅承载着信息&#xff0c;更将激活未来的无限价值&#xff1b;AI&#xff0c;不…

unity cinemachine相机 (案例 跟随角色移动)

安装相机包 打开包管理工具 在 unity registry 搜索cinemachine 会在maincamera中生成一个组件cinemachineBrain 只能通过虚拟相机操控 主相机 虚拟相机的参数 案例 1.固定相机效果 位置 在固定的地方 默认的模式 2.相机跟随人物效果 焦距设置 20 跟随设置 把playere…

【Android】 四大组件详解之广播接收器、内容提供器

目录 前言广播机制简介系统广播动态注册实现监听网络变化静态注册实现开机自启动 自定义广播发送标准广播发送有序广播 本地广播 内容提供器简介运行时权限访问其他程序中的数据ContentResolver的基本用法读取系统联系人 创建自己的内容提供器创建内容提供器的步骤 跨程序数据共…

STM32的GPIO输入和输出函数详解

系列文章目录 STM32单片机系列专栏 C语言术语和结构总结专栏 文章目录 1. GPIO模式 2. GPIO输出 2.1 RCC 2.2 GPIO 3. 代码示例 3.1 RCC时钟 3.2 GPIO初始化 3.3 GPIO输出函数 3.4 推挽输出和开漏输出 4. GPIO输入 4.1 输入模式 4.2 数据读取函数 5. C语言语法 1…

【书生浦语第二期实战营学习笔记作业(四)】

课程文档&#xff1a;https://github.com/InternLM/Tutorial/blob/camp2/xtuner/readme.md 作业文档&#xff1a;https://github.com/InternLM/Tutorial/blob/camp2/xtuner/homework.md 书生浦语第二期实战营学习笔记&作业(四) 1.1、微调理论讲解及 XTuner 介绍 两种Fin…

8.4.3 使用3:配置单臂路由实现VLAN间路由

1、实验目的 通过本实验可以掌握&#xff1a; 路由器以太网接口上的子接口配置和调试方法。单臂路由实现 VLAN间路由的配置和调试方法。 2、实验拓扑 实验拓扑如下图所示。 3、实验步骤 &#xff08;1&#xff09;配置交换机S1 S1(config)#vlan 2 S1(config-vlan)#exit S…

Vue基于高德地图API封装一个地图组件

一、参考资料 高德开放平台 | 高德地图API (amap.com) 二、安装及配置 pnpm i vuemap/vue-amap --save man.ts 密钥及安全密钥需要自己到高德地图开放平台控制台获取. import { createApp } from vue import App from ./App.vue import router from ./router i…

蓝桥杯管道

一开始拿到这道题没有什么头绪。综合各路大佬题解&#xff0c;一下子豁然开朗。 题眼&#xff1a;每一段感受器都感受到水的最早时间。由于整个管道&#xff0c;分为多个段&#xff0c;每个段都有一个感受器。所以题眼翻译为&#xff1a;覆盖满整条管道&#xff0c;所需要的最短…

系统设计 --- E2E Test System

系统设计 --- E2E Test System 什么是E2EE2E Architecture Example 什么是E2E E2E&#xff08;端到端&#xff09;测试是一种软件测试方法&#xff0c;旨在模拟真实的用户场景&#xff0c;测试整个应用程序或系统的端到端功能和交互流程。E2E 测试涵盖了从用户界面到后端系统的…

用于车载T-BOX汽车级的RA8900CE

用于车载T-BOX等高精度计时的汽车级时钟模块RTC:RA8900CE.车载实时时钟芯片RA8900CE内置32.768Khz的晶体&#xff0c;实现年、月、日、星期、小时、分钟和秒精准计时。RA8900CE满足AEC-Q200认证&#xff0c;内置温补功能&#xff0c;保证实时时钟的稳定可靠&#xff0c;功耗低至…

计算机网络3——数据链路层3以太网的MAC层

文章目录 一、MAC 层的硬件地址1、介绍2、注意点3、定制标准 二、MAC 帧的格式1、结构2、工作原理3、其他 一、MAC 层的硬件地址 1、介绍 在局域网中&#xff0c;硬件地址又称为物理地址或 MAC地址(因为这种地址用在MAC帧中)。 大家知道&#xff0c;在所有计算机系统的设计中…

[C++][算法基础]能被整除的数(容斥原理)

给定一个整数 &#x1d45b; 和 &#x1d45a; 个不同的质数 &#x1d45d;1,&#x1d45d;2,…,&#x1d45d;&#x1d45a;。 请你求出 1∼&#x1d45b; 中能被 &#x1d45d;1,&#x1d45d;2,…,&#x1d45d;&#x1d45a; 中的至少一个数整除的整数有多少个。 输入格式…