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

各类排序方法 手撕快排 回顾经典快排 优化版快排

快排的主要思想是分而治之

第一步,确定分界点,a

第二步,调整区间,利用分界点a,把小于分界点a的数放在左边,大于的放在右边,相等的放在哪都可以

第三步,递归处理左右两段

实现(暴力方法)

总数组是q[],然后定义两端数组,l[],r[]

找到一个分界点a

遍历q[],如果q[i]<=a,则放在l[],否则放在r[]

然后再把l[]和r[]放入q[]

实现(优美)

双指针

在区间q[]的左右两端分别放指针i,j

然后还是要确定分界点a

i和j分别往中间移动

当移动i时,发现指针指向的值大于a时候,停止移动

移动j同理,当发现j指向的值小于a的时候,停止移动

此时i,j都判断到了不符合的数,对于他们不符合的数来说

不符合i指针的数符合j的指针,不符合j指针的数符合i的指针,

我们将i,j指向的数交换位置,就可以了

两个指针相遇的时候,i指针经过的数一定小于x

j指针经过的数一定小于y

模板

#include<cstdio>
#include<iostream>
#define ll long long
using namespace std;
ll n;
const int N =1e6+10;
ll q[N];
void kpai(ll q[],int l,int r)//函数开始
{//判断一下如果左右边界大小错误,或者相等,则这个序列已经排完了,returnif(l==r)return;//随便选一个a,为分界点ll a=q[(r+l)/2];//不直接使用lr,是因为下面分割的时候lr还有用//定义i,j,为指针,因为下方是先++再循环,为了配合do while,指针向边界外再移动一格//i是左指针,向外移动一格为-1,j是右指针,向外移动一格为+1ll i=l-1; int j=r+1;//如果i,j相遇,结束循环while(i<j){//先++,再判断循环,如果while遇到i指向的数不小于a,结束循环,j同理//绝对不会死循环,因为判断里没有<=和>=,所以遇见a本身时,一定会停止,没有死循环do i++;while(q[i]<a);do j--;while(q[j]>a);//当循环停止,一定是ij都发现了不符合自己判断条件的数,并且正在指向他//因为至少会发现a,所以一定会停止循环,且交换和a相等的数,也符合预期效果//不符合i的数一定符合j,不符合j的数一定符合i(a除外,他既不符合i也不符合j)//当然,这个过程会导致和a相等的数互换,但是相等的数不影响排序,只是影响一点点速度//a是序列中间的一个值,序列被a划分为两段//如果i>j了,说明左右分界的两段,都已经被遍历过了//现在的情况,符合前面设想的,分阶点左右两边,都一致的小于a或者大于aif(i<j)swap(q[i],q[j]);}//上面的循环结束,证明此时i,j,已经相遇 ,i经过的数一定小于等于a,j经过的数一定大于等于a//把i经过的一段数和b经过的一段数,都看成一个整体,这两段数已经排好序了//我们把i或者j取出来一个,当做分界点//这个分界点和a的分界点不同,a的分界点目的是利用a进行比较大小进行排序//这个分界点的作用是将一段数分成两段,然后再在每段里分别定义分界点a进行排序//这个分段的目的是经过不断的切分,最后把数据切割成最小的数据段,就是一个数//一个数,再进入嵌套的函数的时候,会因为第一个if判断,l==r,而停止循环//在一个数之前,是两个数,或者三个数,将两个数排好顺序,放回在有子串顺序的父串内//假如两个数的父串是四个数,两个数据段,两个数据段是已经排好序了//两个数据段内自己的两个数,经过排序,再放回父串,那父串就是完整的排序后的数据串了//那再将父串放入父串的父串,父串的父串也是完整排序的数据串了//循环往复,数据串排序就结束了kpai(q,l,j);kpai(q,j+1,r);
}
int main(){scanf("%d",&n);//读入for(int i=0;i<n;i++){scanf("%lld",&q[i]);}//快排函数kpai(q,0,n-1);//读出for(int i=0;i<n;i++){cout<<q[i]<<' ';}return 0;
}

相关文章:

各类排序方法 手撕快排 回顾经典快排 优化版快排

快排的主要思想是分而治之 第一步&#xff0c;确定分界点&#xff0c;a 第二步&#xff0c;调整区间&#xff0c;利用分界点a&#xff0c;把小于分界点a的数放在左边&#xff0c;大于的放在右边&#xff0c;相等的放在哪都可以 第三步&#xff0c;递归处理左右两段 实现(暴…...

独一无二的设计模式——单例模式(Java实现)

1. 引言 亲爱的读者们&#xff0c;欢迎来到我们的设计模式专题&#xff0c;今天的讲解的设计模式&#xff0c;还是单例模式哦&#xff01;上次讲解的单例模式是基于Python实现&#xff08;独一无二的设计模式——单例模式&#xff08;python实现&#xff09;&#xff09;的&am…...

使用MoA(Mixture of Agents)混合智能体技术,结合多个开源大语言模型如Llama3、phi-3和Mistral,实现一个强大的AI智能体

1.简介 论文简介: 论文提出了一种称为混合智能体(Mixture-of-Agents,MoA)的方法,利用多个大语言模型(LLM)的集体智慧来提高自然语言理解和生成任务的性能。 MoA采用了分层结构,每一层包含多个LLM智能体。每个智能体都将前一层所有智能体的输出作为辅助信息来生成自己的回答。通…...

前端面试题_Css

一、说一下Css的盒子模型&#xff1f; HTML中所有元素都可以看成是一个盒子 盒子的组成&#xff1a;content、padding、border、margin 盒子的类型&#xff1a; 标准盒模型&#xff1a;marginborderpaddingcontent -- box-sizing&#xff1a;content-box&#xff08;默认&a…...

AI在线免费视频工具3:声音生视频

1、声音生视频 Noisee&#xff1a;通过声音生成对应视频&#xff0c;可以增加prompt指定生成内容相关视频 https://noisee.ai/create...

final、const、readonly关键字在不同语言中代表着什么

一、Java 1.被final修饰的类不能被继承。 2.被final修饰的方法不能被重写。 被 final 修饰的类中所有的成员方法都会隐式的定义为 final 方法。 若父类中 final 方法的访问权限为 private &#xff0c;则子类中不能直接继承该方法。此时可以在子类中定义相同方法名的函数&…...

HarmonyOS ArkUi Tabs+TabContent+List实现tab吸顶功能

Demo效果 Entry Component struct StickyNestedScroll {State message: string Hello WorldState arr: number[] []scroller new Scroller()StyleslistCard() {.backgroundColor(Color.White).height(72).width("100%").borderRadius(12)}build() {Scroll(this.sc…...

Hugging Face Accelerate 两个后端的故事:FSDP 与 DeepSpeed

社区中有两个流行的零冗余优化器 (Zero Redundancy Optimizer&#xff0c;ZeRO)算法实现&#xff0c;一个来自DeepSpeed&#xff0c;另一个来自PyTorch。Hugging FaceAccelerate对这两者都进行了集成并通过接口暴露出来&#xff0c;以供最终用户在训练/微调模型时自主选择其中之…...

TextField是用于在用户界面中输入文本的控件。它广泛应用于表单、搜索框、评论区等需要用户输入文字的场景

TextField是用于在用户界面中输入文本的控件。它广泛应用于表单、搜索框、评论区等需要用户输入文字的场景。以下是对TextField的详细解释&#xff0c;涵盖其各个方面的功能和属性。 基本属性 text 描述&#xff1a;TextField中当前显示的文本。用法&#xff1a;text: "示…...

MYSQL 四、mysql进阶 5(InnoDB数据存储结构)

一、数据库的存储结构&#xff1a;页 索引结构给我们提供了高效的索引方式&#xff0c;不过索引信息以及数据记录都是保存在文件上的&#xff0c;确切说时存储在页结构中&#xff0c;另一方面&#xff0c;索引是在存储引擎中实现的&#xff0c;Mysql服务器上的存储引擎负责对表…...

Spring企业开发核心框架-下

五、Spring AOP面向切面编程 1、场景设定和问题复现 ①准备AOP项目 项目名&#xff1a;Spring-aop-annotation ②声明接口 /*** - * / 运算的标准接口!*/ public interface Calculator { int add(int i, int j); int sub(int i, int j); int mul(int i, in…...

X射线底片焊缝缺陷检测

实现四种焊缝缺陷的检测和分割处理。...

直播的js代码debug解析找到protobuf消息的定义

我们都知道直播的弹幕消息是通过websocket发送的&#xff0c;而且是通过protobuf传输的&#xff0c;那么这里面传输了哪些内容&#xff0c;这个proto文件又要怎么定义&#xff1f;每个消息叫什么&#xff0c;消息里面又包含有哪些字段&#xff0c;每个字段又是什么类型&#xf…...

详细学习es6扩展运算符

ES6中的扩展运算符&#xff08;Spread Operator&#xff09;是一种非常方便的语法&#xff0c;主要用于将可迭代对象&#xff08;比如数组、字符串等&#xff09;展开成多个参数。以下是关于ES6扩展运算符的详细内容&#xff1a; 用法&#xff1a; 在数组字面量中展开数组&am…...

HEC-HMS水文模型教程

原文链接&#xff1a;HEC-HMS水文模型教程https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247607904&idx5&sn1a210328a3fc8f941b433674d8fe2c85&chksmfa826787cdf5ee91d01b6981ebd89deac3e350d747d0fec45ce2ef75d7cb8009341c6f55114d&token90645021…...

Spring Cloud LoadBalancer基础入门与应用实践

官网地址&#xff1a;https://docs.spring.io/spring-cloud-commons/reference/spring-cloud-commons/loadbalancer.html 【1】概述 Spring Cloud LoadBalancer是由SpringCloud官方提供的一个开源的、简单易用的客户端负载均衡器&#xff0c;它包含在SpringCloud-commons中用…...

layui在表格中嵌入上传按钮,并修改上传进度条

当需要在表格中添加上传文件按钮&#xff0c;并不需要弹出填写表单的框的时候&#xff0c;需要在layui中&#xff0c;用按钮触发文件选择 有一点需要说明的是&#xff0c;layui定义table并不是在定义的标签中渲染&#xff0c;而是在紧接着的标签中渲染&#xff0c;所以要获取实…...

14-10 AIGC 项目生命周期——第一阶段

生成式 AI 项目生命周期的整个过程类似于从范围、选择、调整和对齐/协调模型以及应用程序集成开始的顺序依赖过程。流程表明每个步骤都建立在前一步的基础上。有必要了解每个阶段对于项目的成功都至关重要。 下面的流程图重点介绍了生成式 AI 项目生命周期的第一阶段 1 — “范…...

经典小游戏(一)C实现——三子棋

switch(input){case 1:printf("三子棋\n");//这里先测试是否会执行成功break;case 0:printf("退出游戏\n");break;default :printf("选择错误&#xff0c;请重新选择!\n");break;}}while(input);//直到输入的结果为假&#xff0c;循环才会结束} …...

如何利用AI生成可视化图表(统计图、流程图、思维导图……)免代码一键绘制图表

由于目前的AI生成图表工具存在以下几个方面的问题&#xff1a; 大多AI图表平台是纯英文&#xff0c;对国内用户来说不够友好&#xff1b;部分平台在生成图表前仍需选择图表类型、配置项&#xff0c;操作繁琐&#xff1b;他们仍需一份规整的数据表格&#xff0c;需要人为对数据…...

vscode里如何用git

打开vs终端执行如下&#xff1a; 1 初始化 Git 仓库&#xff08;如果尚未初始化&#xff09; git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

Linux 文件类型,目录与路径,文件与目录管理

文件类型 后面的字符表示文件类型标志 普通文件&#xff1a;-&#xff08;纯文本文件&#xff0c;二进制文件&#xff0c;数据格式文件&#xff09; 如文本文件、图片、程序文件等。 目录文件&#xff1a;d&#xff08;directory&#xff09; 用来存放其他文件或子目录。 设备…...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能&#xff0c;包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序

一、开发准备 ​​环境搭建​​&#xff1a; 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 ​​项目创建​​&#xff1a; File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

在现代战争中&#xff0c;电磁频谱已成为继陆、海、空、天之后的 “第五维战场”&#xff0c;雷达作为电磁频谱领域的关键装备&#xff0c;其干扰与抗干扰能力的较量&#xff0c;直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器&#xff0c;凭借数字射…...

【HTTP三个基础问题】

面试官您好&#xff01;HTTP是超文本传输协议&#xff0c;是互联网上客户端和服务器之间传输超文本数据&#xff08;比如文字、图片、音频、视频等&#xff09;的核心协议&#xff0c;当前互联网应用最广泛的版本是HTTP1.1&#xff0c;它基于经典的C/S模型&#xff0c;也就是客…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制

在数字化浪潮席卷全球的今天&#xff0c;数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具&#xff0c;在大规模数据获取中发挥着关键作用。然而&#xff0c;传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时&#xff0c;常出现数据质…...

JS手写代码篇----使用Promise封装AJAX请求

15、使用Promise封装AJAX请求 promise就有reject和resolve了&#xff0c;就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...

Golang——6、指针和结构体

指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...