快速排序算法备考

image.png

image.png

快排模板

快速排序(快排) (C语言实现)_c语言快速排序_Brant_zero2022的博客-CSDN博客
快排使用递归来实现
关键思想:划分


//划分
int partion(int A[],int L,int R){int mid=A[L];while(L<R){//每一次划分:左边元素<枢轴元素<右边元素//R往前找,直到找到一个比mid小的元素,然后把A[R]放在A[L]的位置while(A[R]>=mid && L<R){R--;}A[L]=A[R];while(A[R]<=mid && L<R){L++;}A[R]=A[L];}//存放枢轴元素A[L]=mid;return L;
}//快排
void quickSort(int A[],int L,int R){if(L>=R) return;//递归终止int M=partion(A,L,R);//返回中轴元素的下标//对中轴元素两边分别排序quickSort(A,L,M-1);quickSort(A,M+1,R);}

快排的划分思想

image.png

快排划分思想的算法题

使用划分函数找到数组中第k小的元素

  • 数组中第k小的元素,说明这个元素的左边有k-1个元素比它小,利用快排的划分思想,我们只需要让划分函数返回k-1,就可以找到第k小元素。
  • 如果第一次划分后,返回下标为k-1,那么,我们就找到了这个元素
  • 如果返回的下标>k-1,说明接下来要在[L,M-1]进行划分
  • 如果返回的下标<k-1,说明接下来要在右边进行划分

int partion(int A[],int L,int R){int mid=A[L];while(L<R){	while(A[R]>=mid && L<R) R--;A[L]=A[R];while(A[L]<=mid && L<R) L++A[R]=A[L];}A[L]=mid;}
//非递归实现
int min_k(int A[],int n,int k){int L=0,R=n-1;int M=0;while(1){M=partion(A,L,R);if(M==k-1)  break;//说明找到了else if(M<k-1){//在右边进行划分L=M+1;}else{//在左边进行划分R=M-1;}}return A[K-1]}//递归实现
int min_k(int A[],int L,int R){int M=partion(A,L,R);if(M==k-1)  return A[M];//说明找到了else if(M<k-1){//在右边进行划分min_k(A,M+1,R);}else{min_k(A,L,M-1);}}

分析非递归的复杂度
image.png
image.png

王道课后习题:在数组中找到第k小的元素

image.png
第k小,说明左边有k-1个元素比它小,利用快排的划分思想,只要返回下标为k即可

利用划分思想
//返回划分后的中轴元素的下标
int partion(int L,int left,int right){int mid=L[left];while(left<right){while(L[right]>=mid && left<right) right--;L[left]=L[right];while(L[left]<=mid && left<=right) left++;L[right]=L[left];}L[left]=mid;return left;}int min_k(int L[],int n,int k){int left=1,right=n,M=0;while(1){M=partion(L,left,right);if(M==k) break;else if(M<k)  left=M+1;//要在右边进行划分else right=M-1;//左边划分}return L[k];}

快排算法题实战应用

2011年42题

image.png

方法一双指针(我自己第一遍就想到的思路)

  1. 使用双指针,i指向序列S1元素,j指向S2序列元素,cnt用来记录已经比较的次数。比较s1,s2所指元素大小,如果S1所指元素大,则j向后移动,然后cnt++,如果S2所指元素大,则i向后移动,cnt++,当cnt==L/2时,此时,s1,s2所指元素大的那个就是中位数
  2. 代码

int find(int s1[],int s2[],int n){int i=j=cnt=0;for(cnt=0;cnt<n/2;cnt++;){if(s1[i]<s2[j]){i++;}else{j++; } }//接下来比较s1,s2所指元素大小if(s1[i]>s2[j]){return s1[i];}else{return s2[j];}}

时间复杂度:o(n)
空间复杂度:o(1)

方法二利用快排解决问题

把两个数组合并成一个大数组,然后用快排,下标L/2的元素就是中位数
image.png


//快排划分
int partion(int a[].int L,int R){int mid=a[L];while(L<R){while(a[R]>=mid&& L<R) R--;a[L]=a[R];while(a[L]>=mid && L<R) L++;a[R]=a[L];a[L]=mid;return L;}
//快排void qSort(int a[],int L,int R){if(L<=R) return;int M=partion(a,L,R);qSort(a,L,M-1);qSort(a,M+1,R);}void find(int s1[],int s2[],int n){int a[2*n];int i,j=0;//合并成一个数组for( i=0;i<n;i++)c[j++]=s1[i];}for( i=n;i<2*n;j++){c[j++]=s2[i];}//排序qSort(a,0,2*n-1);return (0+2*n-1)/2;}

2013年41题

方法一利用哈希表(第一遍所想)

1.cnt数组记录元素大小0~n-1出现的次数,出现次数大于n/2的元素就是主元素
2.代码void mainElement(int a[],int n){int cnt[n]={0};//元素值为i就存放在cnt数组的下标为i的位置,并且cnt对应位置元素值+1for(int i=0;i<n;i++){cnt[a[i]]++;}//扫描cnt数组for(int i=0;i<n;i++){if(cnt[i]>n/2) court<<i<<endl;}court<<"不存在主元素"<<endl;}
3.时间复杂度:o(n)空间复杂度o(n)

方法二快排

主元素的元素数量超过数组长度的一半,如果数组有序,并且存在主元素,那么主元素一定在数组的中间位置
image.png

①无序--->有序  快排
②找n/2位置的元素
③从n/2往左、往右统计个数,然后判断存不存在

image.png

2018年41题

image.png
54

方法一哈希表

cnt数组用来记录元素i是否出现在数组中,cnt记录1n,如果元素i位于1n,则对应cnt数组相应位置+1


int fun(int a[],int n){int cnt[n+1];for(int i=0;i<n;i++){if(a[i]>=1 && a[i]<=n) {cnt[a[i]]++;}}//遍历cnt数组,如果cnt[i]==0,说明就是未出现的最小正整数for(int i=1;i<n;i++){if(cnt[i]==0) return i;}//说明1~n都存在return n+1;}时间复杂度  O(n)空间复杂度  O(n)

image.png

方法二快排

image.png

2016年43题(本质是把乱序数组排成有序)

image.png

方法一利用快排

思路:想办法让右边元素大,左边元素小,而且尽量要把数组尽量平分,想到快排的划分思想,为了满足上述条件,右半部分的元素不能比左边元素个数少。
左边:0~n/2-1
右边:n/2~n-1

  1. 把数组A排成递增有序数列,排序后集合A1为[0,n/2-1],集合A2为[n/2n-1]

    此时[S1-S2]最大,[n1-n2]最小
    2.代码

①无序数组拍成有序数组
②说明A1,A2所在区间范围//划分
int partion(int A[],int L,int R){int mid=A[L];while(L<R){//每一次划分:左边元素<枢轴元素<右边元素//R往前找,直到找到一个比mid小的元素,然后把A[R]放在A[L]的位置while(A[R]>=mid && L<R){R--;}A[L]=A[R];while(A[R]<=mid && L<R){L++;}A[R]=A[L];}//存放枢轴元素A[L]=mid;return L;
}//快排
void quickSort(int A[],int L,int R){if(L>=R) return;//递归终止int M=partion(A,0,n-1);//返回中轴元素的下标//对中轴元素两边分别排序quickSort(A,L,M-1);quickSort(A,M+1,R);}
  1. 时间复杂度

    空间复杂度

image.png

方法二利用划分的思想(最优解)

我们知道快排在进行一次划分后,该元素的左边元素都比它小,右边都比它大。我们这道题目本质是把元素大的放右边,元素小的放左边,并没有要求按照 递增进行排序。其实,我们只要找到数组中第n/2小的元素。只要这个元素的位置确定了,那么它左边元素都比它小,右边都比它大。

//划分
int partion(int A[],int L,int R){int mid=A[L];while(L<R){//每一次划分:左边元素<枢轴元素<右边元素//R往前找,直到找到一个比mid小的元素,然后把A[R]放在A[L]的位置while(A[R]>=mid && L<R){R--;}A[L]=A[R];while(A[R]<=mid && L<R){L++;}A[R]=A[L];}//存放枢轴元素A[L]=mid;return L;
}
//
void fun(int A[],int n){int M=0;int k=n/2;int L=0,R=n-1;while(1){M=partion(A,L,R);if(M==k-1) break;else if(M<k-1) L=M+1;else R=M-1}//跳出循环说明已经找到第n/2小的元素}

image.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/16546.shtml

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

相关文章

SQL 语言:基本概述和数据定义

文章目录 1. 数据库语言2. SQL 概述2.1 SQL 的特点2.2 SQL 语言支持三级模式结构2.3 SQL 的基本组成 3. 数据定义3.1 数据类型3.2 创建表3.3 修改和删除表3.4 创建和删除索引3.5 创建和删除视图 1. 数据库语言 数据结构化语言 (Structured Query Language&#xff0c;SQL)&…

【机器学习】——线性模型

&#x1f4bb;博主现有专栏&#xff1a; C51单片机&#xff08;STC89C516&#xff09;&#xff0c;c语言&#xff0c;c&#xff0c;离散数学&#xff0c;算法设计与分析&#xff0c;数据结构&#xff0c;Python&#xff0c;Java基础&#xff0c;MySQL&#xff0c;linux&#xf…

面试被问到不懂的东西,是直接说不懂还是坚持狡辩一下?

大家好&#xff0c;我是瑶琴呀。 面试被问到不懂的东西&#xff0c;是直接说不懂还是坚持狡辩一下&#xff1f;这个问题可以转变一下&#xff0c;如果你顺利拿到 offer&#xff0c;公司安排的工作跟你之前的技术和经验不匹配&#xff0c;你还愿意干下去吗&#xff1f; 转变一…

太速科技-FMC125-两路125Msps AD,两路160Msps DA FMC子卡

FMC125-两路125Msps AD&#xff0c;两路160Msps DA FMC子卡 一、板卡概述 板卡可实现2路14bit 125Msps AD 和2路16bit 160MspsDA功能&#xff0c;FMC LPC连接器用于扩展到xilinx用于模拟信号、中频信号采集&#xff0c;信号发出等应用。 二、性能指标 板卡功能 参…

幻影成像制作中,哪些技术细节不可忽视?

在当今多媒体展厅设计的潮流中&#xff0c;幻影成像技术以其立体的数字影像和卓越的视觉效果&#xff0c;脱颖而出&#xff0c;成为备受瞩目的焦点。它不仅吸引了众多参观者的目光&#xff0c;更在社交媒体上掀起了热烈的讨论。然而&#xff0c;要想在多媒体展厅中精心打造一场…

2024可信赖的企业级生成式 AI 白皮书

来源&#xff1a;COPU&IBM&#xff1a; 近期历史回顾&#xff1a;

k8s devops实战教程+生产实践+可就业

k8s devops实战教程 简介教程涉及到内容教程获取学习教程后的收货助学群 简介 越来越多的企业应用云原生化&#xff0c;催生很多应用的部署方式也发生了很多变化。 从物理机部署应用过度到虚机部署应用再到应用容器化&#xff0c;从单应用再到服务拆分为微服务&#xff0c;靠人…

是他将计算机从“一屋子”变成“一柜子”——量子前哨缅怀小型机之父 戈登·贝尔

内容来源&#xff1a;量子前哨&#xff08;ID&#xff1a;Qforepost&#xff09; 文丨浪味仙 排版丨沛贤 深度好文&#xff1a;6000字丨15分钟阅读 5 月 21 日&#xff0c; 美国贝尔实验室资深人士 John Mashey 发布消息称&#xff0c;计算机先驱戈登贝尔&#xff08;Gordon…

机器人系统ros2-开发学习实践15-模拟用 URDF 建模 步行机器人行走示例

目标&#xff1a; 本教程将向您展示如何建模行走机器人、将状态发布为tf2消息并在 Rviz 中查看模拟。首先&#xff0c;我们创建描述机器人组件的 URDF 模型。接下来&#xff0c;我们编写一个节点来模拟运动并发布 JointState 和变换。然后我们使用robot_state_publisher将整个…

spring cloud alibaba sentinel 配置过程 流控 降级热点 授权

目录 1.基础理论 2.配置 3.加入依赖和配置文件 4.流控 1.基础理论 Sentinel是阿里开源的项目&#xff0c;提供了流量控制、熔断降级、系统负载保护等多个维度来保障服务之间的稳定性。 丰富的应用场景 &#xff1a;Sentinel 承接了阿里巴巴近 10 年的双十一大促流量的核心…

未授权访问:Jupyter Notebook 未授权访问漏洞

目录 1、漏洞原理 2、环境搭建 3、未授权访问 4、利用terminal命令执行 防御手段 今天继续学习各种未授权访问的知识和相关的实操实验&#xff0c;一共有好多篇&#xff0c;内容主要是参考先知社区的一位大佬的关于未授权访问的好文章&#xff0c;还有其他大佬总结好的文章…

cpolar内网穿透工具—无需部署,远程访问网址

文章目录 cpolar介绍安装教程隧道管理VIP客户cpolar介绍 cpolar是一种安全的内网穿透服务,它将局域网下面的本地服务器通过加密隧道暴露至公网,使得公网用户可以正常访问内网服务。 只需一行命令,就可以将内网站点发布至公网,方便给客户演示。高效调试微信公众号、小程序…

全域运营平台的优缺点各有哪些?听听使用者怎么说!

作为多个创业者交流群内的热点话题&#xff0c;关于全域运营平台优缺点的分析和点评不断涌现&#xff0c;为许多创业者更多信息的同时&#xff0c;也让他们的选择过程变得非常艰难。而在众多的全域运营平台中&#xff0c;被分析和点评次数最多的&#xff0c;当属全域运营平台。…

css3实现0.5px边框

效果图 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>css3实现0.5px边框</title><s…

电商API接口助力直播带货选品||助力电商平台搭建选品

如今&#xff0c;直播带货如火如荼。直播带货的核心是卖货、品牌盈利&#xff0c;那想要带货效果更好&#xff0c;选品及定价是最关键的环节。 事实上&#xff0c;品牌企业可以直接使用API接口工具来辅助自身选品及定价&#xff0c;这主要是因为比价工具在直播带货选品环节能起…

dubbo复习:(4) 和springboot 整合时,客户端负载均衡的配置

需要在DubboReference注解指定loadbalance属性。示例如下&#xff1a; package cn.edu.tju.service;import org.apache.dubbo.config.annotation.DubboReference; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Ser…

Java+IDEA+SpringBoot药物不良反应ADR智能监测系统源码 ADR智能化监测系统源码

JavaIDEASpringBoot药物不良反应ADR智能监测系统源码 ADR智能化监测系统源码 药物不良反应&#xff08;Adverse Drug Reaction&#xff0c;ADR&#xff09;是指在使用合格药品时&#xff0c;在正常的用法和用量下出现的与用药目的无关的有害反应。这些反应往往因药物种类、使用…

【全开源】排队叫号系统源码(FastAdmin+GatewayWorker)

一款基于FastAdminGatewayWorker开发的多项目多场景排队叫号系统&#xff0c;支持大屏幕投屏&#xff0c;语音播报叫号&#xff0c;可用于餐厅排队取餐、美甲店排队取号、排队领取、排队就诊、排队办理业务等诸多场景&#xff0c;助你轻松应对各种排队取号叫号场景。 ​打造高…

03. Spring 事务管理

文章目录 1. Spring 事务管理简介2. Transactional 注解属性信息3. Transactional 简单使用4. Transactional 使用注意事项4.1 正确指定事务回滚的异常类型4.1.1 Java 异常继承体系 4.2 Transactional 注解应用在 public 方法或类上才有效4.3 正确设置 Transactional 的 propag…

西门子smart line触摸屏软件安装 WinCC Flexible Smart V4SP1 V3

提示&#xff1a;Wincc flexible smart软件为西门子Smart line系列触摸屏的专用组态软件&#xff0c;这款屏不能用博途来组态&#xff0c;只能用这个软件来组态。西门子Smart line系列触摸屏的常用型号为SMART 700 IE V3/V4&#xff0c;SMART 1000 IE V3/V4。 Wincc flexible …