排序算法--快速排序
一、三色旗问题
问题描述
有一个数组是只由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,1,2三种元素构成的整数数组,请使用交换、原地排序而不是计数进行排序: 解题思路 1.定义两个变量,i和j(下标),从index0开始遍历 2.如…...

springMVC -- 学习笔记
前言简介演示 ⇒ (最简单的原理,开发并不这样,理解一下就好)演示 ⇒ 接近真实注解开发(好好理解一下)重要的源码献上 Controller 讲解RequestMapper ⇒ 没啥记的,第一个案例看看就行了RestFul 风…...
修复本地终端(windows)连接服务器使用zsh出现乱跳的问题
目前市面上还没有发现解决方案,记录一下! 1.起因: 在服务器配置了zsh后,用本地的windows去连接的时候,终端内容会出现乱跳,比如输入了一个“l”,后面出现多个“lll”,如下: ⚡ 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__() # 调用基类的初始化方法# 初始化一个序列模型,包含卷积层、…...
vue2 使用axios 请求后台返回文件流导出为excel
目录 步骤 1: 安装 Axios 步骤 2: 创建 Axios 实例 步骤 3: 发起请求并处理文件流 说明 步骤 1: 安装 Axios 首先,确保项目中已经安装了 Axios。如果没有,可以通过以下命令进行安装: npm install axios 步骤 2: 创建 Axios 实例 为了更…...

MATLAB数据可视化:在地图上画京沪线的城市连线
matlab自带的geoplot(lat,lon) 可以在地理坐标中绘制线条。使用 lat和lon分别指定以度为单位的经度和纬度坐标。 绘制京沪线所经城市线条: citys [116.350009,39.853928; 116.683546,39.538304; 117.201509,39.085318; 116.838715,38.304676;...116.359244,37.436…...
【AI】CV基础1
定期更新,建议关注更新收藏。 本站友情链接: OCR篇1 可变形卷积Deformable Conv opencv-python形态学操作合集 目录 仿射变换图像二阶导数本质探讨PIL通道、模式、尺寸、坐标系统、调色板、信息滤波器实现图像格式转换 OpenCV轮廓提取 仿射变换 仿射变换…...

数据结构《栈》
数据结构《栈》 1、栈的概念及结构2、栈的实现3、练习: 1、栈的概念及结构 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端 称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO&…...
说一说mysql的having?和where有什么区别?
在 MySQL 中,HAVING 子句和 WHERE 子句都是用于过滤查询结果的,但它们之间有一些重要的区别。下面我将详细介绍这两个子句的区别以及它们的使用场景。 1. HAVING 子句 作用: HAVING 子句用于过滤聚合后的结果集。它通常与 GROUP BY 子句一起使用&#x…...
LeetCode45. 跳跃游戏 II
题目链接: 45. 跳跃游戏 II - 力扣(LeetCode) 思路分析:这属于上一题的变种,思路有所不同,要用到贪心的思想。从第一步开始,在可以跳跃的范围内,选择能够到达最远位置的点将其作为…...

算法打卡 Day19(二叉树)-平衡二叉树 + 二叉树的所有路径 + 左叶子之和 + 完全二叉树的节点个数
Leetcode 101-平衡二叉树 文章目录 Leetcode 101-平衡二叉树题目描述解题思路 Leetcode 257-二叉树的所有路径题目描述解题思路 Leetcode 404-左叶子之和题目描述解题思路 Leetcode 222-完全二叉树的节点个数题目描述解题思路 题目描述 https://leetcode.cn/problems/balanced…...
国际以太网专线 (IEPL)/国际专线(IPLC)-全球覆盖,无界沟通
中国联通国际公司产品:国际以太网专线 (IEPL)/国际专线(IPLC)—— 跨境数据传输的坚实桥梁 在全球化日益加深的今天,跨境、跨地域的数据传输需求激增,企业对数据传输的速度、安全性和稳定性提出了前所未有的高要求。中…...

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

HCIE学习笔记:IPV6 地址、ICMP V6、NDP 、DAD (更新补充中)
系列文章目录 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 系列文章目录前言一、IPV4、IPv6包头对比1. IPV4包头2.IPv6包头3.IPV6扩展包头 二、IPV6基础知识地址结构、地址分类三、ICMPV4、ICMPV61、 lnternet控…...

人工智能】Transformers之Pipeline(九):物体检测(object-detection)
目录 一、引言 二、物体检测(object-detection) 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
分析代码:1.包含flag2.php 2.GET传name,POST传password $name ! $password && md5($name) md5($password) 属于MD5绕过中的php 弱类型绕过 解题方法: 方法一 import requests# 网站的URL url "http://node7.anna.nssctf.cn:28026&q…...

Redis面试题大全
文章目录 Redis有哪几种基本类型Redis为什么快?为什么Redis6.0后改用多线程?什么是热key吗?热key问题怎么解决?什么是热Key?解决热Key问题的方法 什么是缓存击穿、缓存穿透、缓存雪崩?缓存击穿缓存穿透缓存雪崩 Redis…...
【langchain学习】BM25Retriever和FaissRetriever组合 实现EnsembleRetriever混合检索器的实践
展示如何使用 LangChain 的 EnsembleRetriever 组合 BM25 和 FAISS 两种检索方法,从而在检索过程中结合关键词匹配和语义相似性搜索的优势。通过这种组合,我们能够在查询时获得更全面的结果。 1. 导入必要的库和模块 首先,我们需要导入所需…...

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

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…...

C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...

听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...

逻辑回归暴力训练预测金融欺诈
简述 「使用逻辑回归暴力预测金融欺诈,并不断增加特征维度持续测试」的做法,体现了一种逐步建模与迭代验证的实验思路,在金融欺诈检测中非常有价值,本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...

Qemu arm操作系统开发环境
使用qemu虚拟arm硬件比较合适。 步骤如下: 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载,下载地址:https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...