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

排序算法--快速排序

一、三色旗问题

问题描述

有一个数组是只由0,1,2三种元素构成的整数数组,请使用交换、原地排序而不是计数进行排序:

解题思路

1.定义两个变量,i和j(下标),从index=0开始遍历

2.如果a[index]==0,swap(a[index++],a[++i]);这里index++是因为index左边不可能有==2的数据了

3.如果a[index]==1,index++;

4.如果a[index]==2,swap(a[index],a[--j]);这里index没有++是因为在右侧不知道交换过来的数据是大于1还是小于1还是等于1,留到下一轮继续判断

5.i的含义:<=i 的部分都是比1小的。所以i的初始值为-1

6.j的含义:>=j 的部分都是比1大的。所以j的初始值为n

列举实例

int a[]={1,1,2,0,1,1,0,2,0,1,2};

#include <vector>
#include <iostream>
using namespace std;void quick(vector<int>& v)
{int n=v.size();int i=-1,j=n;int idx=0;int key=1;while(idx<j){if(v[idx]==key) idx++;else if(v[idx]<tmp) swap(v[++i],v[idx++]);else if(v[idx]>tmp) swap(v[--j],v[idx]);   }
}
int main()
{int n;cin>>n;vector<int> v(n);for(int i=0;i<n;i++){cin>>v[i];}quick(v);for(auto e : v){cout<<e<<" ";}cout<<endl;return 0
}

 二、分治思想

假设你是农场主,有一小块土地。你要将这块土地均匀地分成方块,且分出的方块要尽可能地大。显然一下的分法都不符合要求:

 如何将一块地均匀地分成方块,并确保分出的方块是最大地呢?使用分而治之地策略!

分而治之算法是递归的。过程包括两个步骤:

第一步:找出基线条件,这种条件必须尽可能简单。

第二步:不断将问题分解成解法相同的两个问题(不断缩小问题规模,直至找到基线条件)

能使用的最大方块有多大呢》首先找出基线条件。最容易处理的情况是,一条边的长度是另一条边的整数倍。

如果一条边长为25m,另一边长为50m,那么可使用地最大方块就是25*25的。换言之,可以将这块地分成两个这样的方块。

每次递归调用都必须缩小问题的规模。如何缩小前述问题的规模呢?我们首先找出这块地可容纳的最大方块。

 可以从这块地中画出两个640*640的方块,同时余下一小块地。现在是顿悟时刻:为何不对余下的那一小块地使用同样的算法呢?

 最初要划分的土地尺寸为1680*640,而现在要划分的土地更小,为640*400.适用于这小块地的最大方块,也是适用于整块地的最大方块。换言之,你将均匀划分1680*640土地的问题,简化成了640*400土地的问题

下面再次使用同样的算法。对于640*400的土地,可以从中划分出的最大方块为400*400。这将余下一块更小的土地:400*240。

 可以从这块土地中划分出最大的方块余下一块更小的土地,尺寸为240*160

接下来继续划分最终余下:160*80的土地。余下的这块土地,满足基线条件,因为160是80的整数倍2倍,将这两块土地划分为两个方块后,将不会余下任何土地。

因此对最初那块地的划分,适用的最大方块为80*80

 这里重申一下分治的工作原理

1.找出简单的基线条件。

2.确定如何缩小问题的规模,使其符合基线条件。

三、快速排序

对于排序算法来说,最简单的数组是什么样子的呢?其实就是根本不需要排序的数组。

也就是空数组或者只包含一个元素的数组。因此基线条件为空数组或单元素的数组。在这种情况下,只需要返回数组--根本不用排序。

void QuickSort(int arr[],int n){if(n<2) return;
}

下面我们看一下更长的数组:双元素数组。对包含两个元素的数组进行排序也很容易:

检查第一个元素是否比第二个元素小,如果不比第二个小,就交换它们的位置

那么接下来就是三元素数组。对包含三个元素的数组进行排序:

我们理所应当的想到了一开始提到的三色旗问题,和分而治之的思想。

工作原理

第一步:从数组中选取一个元素,这个元素被称为基准值。

我们暂时将数组的第一个元素用作基准值。

第二步:找出比基准值小的元素以及比基准值大的元素。

小的放到基准值左边,大的放到基准值右边。

现在数组被我们分成了三个部分:

一部分为小于基准值的所有元素

基准值(此时,基准值已经被放在了它所应在的位置)

一部分为大于基准值的所有元素

这里只是进行了分区,得到的两个子数组是无序的。单如果这两个数组是有序的,对整个数组进行排序非常容易。

 如果子数组是有序的,就可以像下面这样合并并得到一个有序的数组:左边的数组+基准值+右边的数组。在这里,就是【10,15】+【33】+【 】,结果为有序数组【10,15,33】.

如何对子数组进行排序呢?

对于包含两个元素的数组(左子数组)以及空数组(右子数组),快速排序直到如何将它们排序,因此只要对这两个子数组进行快速排序,再合并结果,就得到了一个有序数组!

代码实现 

#include <bits/stdc++>
using namespace std;void quickSort(vector<int>& v,int L,int R)
{if(L>=R) return;int key_val=v[L];int i=L-1,j=R+1;int idx=L;while(idx<L){if(v[idx]==key_val) idx++;else if(v[idx]<key_val) swap(v[++i],v[idx++]);else if(v[idx]>key_val) swap(v[--j],v[idx]);}quickSort(v,L,i);//将左子数组进行快排quickSort(v,j,R);//将右子数组进行快排//直到L==R,结束递归,每次递归都会将L-R的基准值放到合适的位置//递归结束后所有元素都已经排好序了
}

 算法分析

时间复杂度:O(nlogn)

对于快排而言,最优的情况就是,每次划分的都很均匀,假设要排序n个元素,第一次划分的时候,需要对整个数组扫描一下,做n次比较的时间为T(n)。然后将数组一分为二,那么各自还需要T(n/2)的时间(注意是最好的情况,所以平分一半)。于是不断地划分辖区,我们就有了下面地不等式推断:

T(1) == 0
T(n) <= 2*T(n/2) + n 
T(n) <= 2*(2*T(n/4)+n/2) + n == 4*T(n/4)+2*n
T(n) <= 4*(2*T(n/8)+n/4) + 2*n ==8*T(n/8)+3*n
...
T(n) <= nT(1) + (logn)*n == O(nlogn) 

稳定性:不稳定


感谢大家!

相关文章:

排序算法--快速排序

一、三色旗问题 问题描述 有一个数组是只由0&#xff0c;1&#xff0c;2三种元素构成的整数数组&#xff0c;请使用交换、原地排序而不是计数进行排序&#xff1a; 解题思路 1.定义两个变量&#xff0c;i和j&#xff08;下标&#xff09;&#xff0c;从index0开始遍历 2.如…...

springMVC -- 学习笔记

前言简介演示 ⇒ &#xff08;最简单的原理&#xff0c;开发并不这样&#xff0c;理解一下就好&#xff09;演示 ⇒ 接近真实注解开发&#xff08;好好理解一下&#xff09;重要的源码献上 Controller 讲解RequestMapper ⇒ 没啥记的&#xff0c;第一个案例看看就行了RestFul 风…...

修复本地终端(windows)连接服务器使用zsh出现乱跳的问题

目前市面上还没有发现解决方案&#xff0c;记录一下&#xff01; 1.起因&#xff1a; 在服务器配置了zsh后&#xff0c;用本地的windows去连接的时候&#xff0c;终端内容会出现乱跳&#xff0c;比如输入了一个“l”&#xff0c;后面出现多个“lll”&#xff0c;如下: ⚡ roo…...

【扒代码】regression_head.py

import torch from torch import nnclass UpsamplingLayer(nn.Module):# 初始化 UpsamplingLayer 类def __init__(self, in_channels, out_channels, leakyTrue):super(UpsamplingLayer, self).__init__() # 调用基类的初始化方法# 初始化一个序列模型&#xff0c;包含卷积层、…...

vue2 使用axios 请求后台返回文件流导出为excel

目录 步骤 1: 安装 Axios 步骤 2: 创建 Axios 实例 步骤 3: 发起请求并处理文件流 说明 步骤 1: 安装 Axios 首先&#xff0c;确保项目中已经安装了 Axios。如果没有&#xff0c;可以通过以下命令进行安装&#xff1a; npm install axios 步骤 2: 创建 Axios 实例 为了更…...

MATLAB数据可视化:在地图上画京沪线的城市连线

matlab自带的geoplot(lat,lon) 可以在地理坐标中绘制线条。使用 lat和lon分别指定以度为单位的经度和纬度坐标。 绘制京沪线所经城市线条&#xff1a; citys [116.350009,39.853928; 116.683546,39.538304; 117.201509,39.085318; 116.838715,38.304676;...116.359244,37.436…...

【AI】CV基础1

定期更新&#xff0c;建议关注更新收藏。 本站友情链接&#xff1a; OCR篇1 可变形卷积Deformable Conv opencv-python形态学操作合集 目录 仿射变换图像二阶导数本质探讨PIL通道、模式、尺寸、坐标系统、调色板、信息滤波器实现图像格式转换 OpenCV轮廓提取 仿射变换 仿射变换…...

数据结构《栈》

数据结构《栈》 1、栈的概念及结构2、栈的实现3、练习: 1、栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端 称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO&…...

说一说mysql的having?和where有什么区别?

在 MySQL 中&#xff0c;HAVING 子句和 WHERE 子句都是用于过滤查询结果的&#xff0c;但它们之间有一些重要的区别。下面我将详细介绍这两个子句的区别以及它们的使用场景。 1. HAVING 子句 作用: HAVING 子句用于过滤聚合后的结果集。它通常与 GROUP BY 子句一起使用&#x…...

LeetCode45. 跳跃游戏 II

题目链接&#xff1a; 45. 跳跃游戏 II - 力扣&#xff08;LeetCode&#xff09; 思路分析&#xff1a;这属于上一题的变种&#xff0c;思路有所不同&#xff0c;要用到贪心的思想。从第一步开始&#xff0c;在可以跳跃的范围内&#xff0c;选择能够到达最远位置的点将其作为…...

算法打卡 Day19(二叉树)-平衡二叉树 + 二叉树的所有路径 + 左叶子之和 + 完全二叉树的节点个数

Leetcode 101-平衡二叉树 文章目录 Leetcode 101-平衡二叉树题目描述解题思路 Leetcode 257-二叉树的所有路径题目描述解题思路 Leetcode 404-左叶子之和题目描述解题思路 Leetcode 222-完全二叉树的节点个数题目描述解题思路 题目描述 https://leetcode.cn/problems/balanced…...

国际以太网专线 (IEPL)/国际专线(IPLC)-全球覆盖,无界沟通

中国联通国际公司产品&#xff1a;国际以太网专线 (IEPL)/国际专线&#xff08;IPLC&#xff09;—— 跨境数据传输的坚实桥梁 在全球化日益加深的今天&#xff0c;跨境、跨地域的数据传输需求激增&#xff0c;企业对数据传输的速度、安全性和稳定性提出了前所未有的高要求。中…...

信息安全管理知识体系攻略(至简)

信息安全管理知识体系主要包括信息安全管理体系、信息安全策略、信息安全系统、信息安全技术体系等。 一、信息安全管理 1、信息安全管理体系&#xff08;ISMS&#xff09;。ISO27001是国际标准化组织&#xff08;ISO&#xff09;和国际电工委员会&#xff08;ICE&#xff09…...

HCIE学习笔记:IPV6 地址、ICMP V6、NDP 、DAD (更新补充中)

系列文章目录 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 系列文章目录前言一、IPV4、IPv6包头对比1. IPV4包头2.IPv6包头3.IPV6扩展包头 二、IPV6基础知识地址结构、地址分类三、ICMPV4、ICMPV61、 lnternet控…...

人工智能】Transformers之Pipeline(九):物体检测(object-detection)

目录​​​​​​​ 一、引言 二、物体检测&#xff08;object-detection&#xff09; 2.1 概述 2.2 技术原理 2.3 应用场景 2.4 pipeline参数 2.4.1 pipeline对象实例化参数 2.4.2 pipeline对象使用参数 2.4 pipeline实战 2.5 模型排名 三、总结 一、引言 pipel…...

[SWPUCTF 2021 新生赛]easy_md5

分析代码&#xff1a;1.包含flag2.php 2.GET传name&#xff0c;POST传password $name ! $password && md5($name) md5($password) 属于MD5绕过中的php 弱类型绕过 解题方法: 方法一 import requests# 网站的URL url "http://node7.anna.nssctf.cn:28026&q…...

Redis面试题大全

文章目录 Redis有哪几种基本类型Redis为什么快&#xff1f;为什么Redis6.0后改用多线程?什么是热key吗&#xff1f;热key问题怎么解决&#xff1f;什么是热Key&#xff1f;解决热Key问题的方法 什么是缓存击穿、缓存穿透、缓存雪崩&#xff1f;缓存击穿缓存穿透缓存雪崩 Redis…...

【langchain学习】BM25Retriever和FaissRetriever组合 实现EnsembleRetriever混合检索器的实践

展示如何使用 LangChain 的 EnsembleRetriever 组合 BM25 和 FAISS 两种检索方法&#xff0c;从而在检索过程中结合关键词匹配和语义相似性搜索的优势。通过这种组合&#xff0c;我们能够在查询时获得更全面的结果。 1. 导入必要的库和模块 首先&#xff0c;我们需要导入所需…...

【C语言】预处理详解(上)

文章目录 前言1. 预定义符号2. #define 定义常量3. #define定义宏4. 带有副作用的宏参数5. 宏替换的规则 前言 在讲解编译和链接的知识点中&#xff0c;我提到过翻译环境中主要由编译和链接两大部分所组成。 其中&#xff0c;编译又包括了预处理、编译和汇编。当时&#xff0c…...

uni-app内置组件(基本内容,表单组件)()二

文章目录 一、 基础内容1.icon 图标2.text3.rich-text4.progress 二、表单组件1.button2.checkbox-group和checkbox3.editor 组件4.form5.input6.label7.picker8.picker-view 和 picker-view-column9.radio-group 和 radio10.slider11.switch12.textarea 一、 基础内容 1.icon…...

实战演练:基于快马平台与zeroclaw理念构建高性能个人博客系统

最近在尝试用zeroclaw理念重构个人博客系统&#xff0c;发现这种极简高效的设计思路确实能大幅提升开发效率和运行性能。今天就来分享下基于InsCode(快马)平台实现的完整实战过程。 项目架构设计 zeroclaw的核心是"零冗余"&#xff0c;所以在设计阶段就做了严格的功能…...

马斯克最新对话:AI 毁灭人类的概率有 20%,但它将创造一个没有钱的“全民高收入”时代

“我宁愿看到结局&#xff0c;也不愿无聊老去。”编译 | 王启隆来源 | youtu.be/N5KCm_55xeQ出品丨AI 科技大本营&#xff08;ID&#xff1a;rgznai100&#xff09;在此前结束的 2026 Abundance Summit 上&#xff0c;X奖基金会创始人彼得戴曼迪斯&#xff08;Peter Diamandis&…...

【优化求解】用于密集子图和密集子矩阵问题的凸优化附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f447; 关注我领取海量matlab电子书和数学建模资料&#x1f34a;个人信条&#xff1a;格物致知,完整Matl…...

Docker-compose一键部署OnlyOffice实战指南

1. 为什么选择Docker-compose部署OnlyOffice&#xff1f; 如果你正在寻找一个开箱即用的文档协作解决方案&#xff0c;OnlyOffice绝对是当前最值得考虑的选择之一。它提供了媲美微软Office的编辑体验&#xff0c;同时支持多人实时协作、版本控制等企业级功能。而使用Docker-com…...

用STM32F103RCT6和AD9959搞定电赛C题:一个无线信号模拟系统的完整搭建与调试实录

从零构建电赛C题无线信号模拟系统&#xff1a;STM32F103RCT6与AD9959实战全记录 全国大学生电子设计大赛的C题向来以高难度和综合性著称&#xff0c;今年的无线信号模拟系统题目更是让不少参赛队伍挠头。作为一支从零开始的团队&#xff0c;我们在四天三夜的极限时间里&#xf…...

经典入门教程:Simulink二次调频AGC系统解析,含储能与火电机组应用

simulink二次调频AGC&#xff0c;含储能、火电机组。 经典两区域系统二次调频&#xff0c;适合初学者入门。电力系统二次调频就像给电网做瑜伽——既要保持平衡&#xff0c;又要灵活应对突发状况。今天咱们用Simulink撸个带储能的两区域AGC模型&#xff0c;手把手感受火力发电机…...

终极指南:gallery本地AI模型平台的架构演进与技术发展历程

终极指南&#xff1a;gallery本地AI模型平台的架构演进与技术发展历程 【免费下载链接】gallery A gallery that showcases on-device ML/GenAI use cases and allows people to try and use models locally. 项目地址: https://gitcode.com/GitHub_Trending/gallery44/galle…...

VS Code官宣:全面支持Rust!

当"宇宙第一编辑器"遇上"内存安全的叛逆少年"&#xff0c;这场联姻比想象中更甜&#xff5e;最近微软悄悄放了个大招&#xff1a;VSCode 要深度集成 rust-analyzer 了&#xff01; &#x1f389; 什么意思呢&#xff1f;以前你用 VSCode 写 Rust&#xff0…...

突破暗黑破坏神2单机限制:PlugY全方位增强工具深度指南

突破暗黑破坏神2单机限制&#xff1a;PlugY全方位增强工具深度指南 【免费下载链接】PlugY PlugY, The Survival Kit - Plug-in for Diablo II Lord of Destruction 项目地址: https://gitcode.com/gh_mirrors/pl/PlugY 暗黑破坏神2作为ARPG游戏的经典之作&#xff0c;其…...

VS2022下载与全面使用指南

Visual Studio 2022&#xff08;简称VS2022&#xff09;是微软推出的最新一代集成开发环境&#xff08;IDE&#xff09;&#xff0c;于2021年11月正式发布&#xff0c;相比上一代VS2019&#xff0c;在性能优化、功能迭代、兼容性提升等方面实现了全方位升级&#xff0c;被誉为“…...