【模板】快速排序及寻找区间第k大

快速排序_第k个数例题讲解 快速排序(Quicksort)是对冒泡排序算法的一种改进,快速排序的思考方式与归并排序类似,都是二分、分治的思想。1、3没有什么难度,重点在于2,如何把数据按照分界点移到左右两边。这里提供一个双指针思想的模板,选取i、j两个指针(i = left - 1 j = right + 1),每次先加减位置再判断大小,所以i和j初始化要比left和right大一点。刚开始q[i]x,i和j不断向中间移动,当条件不满足时退出循环。 阅读详情

快速排序基本思想:分治法

快速排序基本流程

选择序列的一个元素为枢轴(程序中选择第1个元素),然后设计两个指针(start和end),将所有剩余元素依次和枢轴进行比较,根据比较结果,将比枢轴大的元素都排在它的后面,比枢轴小的元素都排在它的前面,这样一趟排序以后(start==end),序列就以枢轴为界划分成了两个部分。然后,递归地对这两个部分再进行上述操作,直到每一部分都只有一个数据元素为止(递归结束条件)。

特性

(1)平均时间复杂度最快的排序算法(o(nlogn)),最好时间复杂度也是o(nlogn)。

(2)当初始序列已经有序时,快速排序蜕化成了冒泡排序,时间复杂度为o(n^2)。

稳定性

不稳定(如上图,交换元素时会改变相等元素的相对位置)。

有关的改进

快速排序算法的性能取决于划分的对称性。通过修改算法quickSort,可以设计出采用随机选择策略的快速排序算法。在快速排序算法的每一步中,当数组还没有被划分时,可以在a[p:r]中随机选出一个元素作为划分基准,这样可以使划分基准的选择是随机的,从而可以期望划分是较对称的。

代码1:

#include<stdio.h>
void Qsort(int arr[],int low,int high)
{
	if(low>=high) return;//结束条件 
	int start=low;
	int end=high;
	int key=arr[start];//用第1个元素作为关键值 
	while(start<end)
	{
		while(start<end && arr[end]>=key)
		{
			end--;
		}
		arr[start]=arr[end];//将比关键值小的元素放到序列低端 
		while(start<end && arr[start]<=key)
		{
			start++;
		}
		arr[end]=arr[start];//将比关键值大的元素放到序列高端 
	}
	arr[start]=key;//还原 
	Qsort(arr,low,start-1);
	Qsort(arr,start+1,high);//递归 
}
int main(void)
{
	int length;
	while(scanf("%d",&length)!=EOF)
	{
		int m[10000];
		for(int i=0;i<length;i++){
			scanf("%d",&m[i]);
		}
		Qsort(m,0,length-1);
		for(int i=0;i<length;i++){
			printf("%d ",m[i]);
		}
		printf("\n");
	}
	return 0;
}

代码2:

//快速排序
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cmath>
using namespace std;
void swap(int a[],int elem1,int elem2)
{
	int tmp = a[elem1];
	a[elem1]=a[elem2];
	a[elem2]=tmp;
}
void quickSort(int a[],int low,int high){
	if(low>=high) return;
	int start = low;
	int end = high;//避免待会儿递归时污染数值 
	int key = a[start];//以第一个元素为枢轴 
	while(start<end)
	{
		while(start<end && a[end]>=key)
		{
			end--;
		} 
		swap(a,start,end);//交换 
		while(start<end && a[start]<=key)
		{
			start++;
		}
		swap(a,start,end);//交换 
	}
	quickSort(a,low,start-1);
	quickSort(a,start+1,high);//递归 
} 
void quickSortHelp(int a[],int n){
	quickSort(a,0,n-1);
}
 int main(void)
{
	int n = 10;
	int arr[10] = {0};
	for(int i=0;i<n;i++)
	{
		arr[i]=rand()%100;
	}
	for(int i=0;i<n;i++)
	{
		cout<<arr[i]<<" ";
	}
	cout<<endl; 
	quickSortHelp(arr,n);
	for(int i=0;i<n;i++)
	{
		cout<<arr[i]<<" ";
	}
	return 0;
}

 

寻找区间第k大

基于以上,可以在o(n)(平均)时间复杂度内寻找第K大的元素,当然最坏的时间复杂度依然是o(n^2)。

思路是与快速排序一致的,只是在查找时,根据查找的元素(下标K)与枢轴位置的关系,只查找其中的一部分。

#include<iostream>
#include<stdlib.h>
using namespace std;
int arr[1000001];
//区间习惯:左开右闭 
void partition(int arr[],int p,int q,int k)//寻找第k大
{
	if(p>=q) return; 
	int random = (rand() % (q-p))+ p;//随机选择枢轴
	int key = arr[p];
	int start = p;
	int end = q-1;
	while(start<end)
	{
		while(start<end&&arr[end]>=key)//等号
		{
			end--;
		}
		arr[start]=arr[end];
		while(start<end&&arr[start]<=key)
		{
			start++;
		}
		arr[end] = arr[start];
	}
	arr[start]=key;//还原
	//当start==end
	if(k==start) return;//此时start是枢轴元素在最终有序序列的下标,找到直接返回
	if(k>start) //比寻找的比枢轴大,只需要在比枢轴大的区间继续查找
	{
		partition(arr,start+1,q,k);
	}
	if(k<start)//反之,只需要在比枢轴小的区间继续查找
	{
		partition(arr,p,start,k);
	}
	
 } 
 int main(void)
 {
 	int n,k;
 	cin>>n>>k;
 	for(int i=0;i<n;i++)
 	{
 		scanf("%d",&arr[i]); 
	 }
	 partition(arr,0,n,n-k);
	 cout<<arr[n-k]<<endl;
	 return 0;
 }

图片来源:https://blog.youkuaiyun.com/hellozhxy/article/details/79911867

SHP转TXT、TXT转SHP工具(附工具下载链接) 关于TXT,可以选择整个图层生成一个TXT。也可以勾选“每个地块单独存TXT”,然后选择一个字段,根据字段值,给每个地块生成一个TXT文件。支持选择和数据框一样的坐标系,也可以选择一个图层,工具会采用和这个图层一样的坐标系。1、TXT数据支持输入单个或者多个TXT文件,也可以直接选择TXT所在的文件夹。所有的TXT数据都生成到一个矢量数据图层。关于这一行的内容,可以在地块坐标行设置中进行设置。其他:①面节点闭合:勾选,则回到起点。属性描述:可以直接复制粘贴进来,也可以直接修改。也可以改为任意字母。 阅读详情

相关推荐

Coze HTTP请求节点实战:5分钟搞定天气API对接(含动态参数技巧)

本文通过一个天气预报API对接的实战案例,详细讲解了如何在Coze平台使用HTTP请求节点实现外部数据交互。文章重点演示了动态参数传递、JSON响应解析与错误处理等核心技巧,帮助开发者在5分钟内快速构建稳定可靠的智能体外部服务调用能力。

weixin_29233333的博客 677

排序:如何用快排思想在O(n)内查找第K大元素?

冒泡排序、插入排序、选择排序三种排序算法,时间复杂度都是O(n^2),比较高,适合小规模数据的排序。和两种时间复杂度O(nlogn)的排序算法,适合大规模的数据排序,比上述三种更常用。归并排序和快速排序都用到了分治思想,非常巧妙。我们可以借助这个思想,解决排序问题:如何在O(n)的时间复杂度内查找一个无序数组中的第K大元素?

贾欣晓的博客 801

Intel RealSense D435 深度相机详解

Intel RealSense D435 深度相机是 Intel 推出的一款基于深度感知技术的相机,广泛应用于机器人、无人机、增强现实(AR)、虚拟现实(VR)、3D扫描、智能监控等领域。D435 是 RealSense 系列中较为高端的深度相机之一,结合了深度传感和 RGB 摄像技术,为用户提供高精度的深度数据和高质量的图像捕捉能力。

crasher123的博客 2949

12 | 排序(下):如何用快排思想在O(n)内查找第K大元素?

上一节我讲了冒泡排序、插入排序、选择排序这三种排序算法,它们的时间复杂度都是 O(n2),比较高,适合小规模数据的排序。今天,我讲两种时间复杂度为 O(nlogn) 的排序算法,归并排序和快速排序。这两种排序算法适合大规模的数据排序,比上一节讲的那三种排序算法要更常用。 归并排序和快速排序都用到了分治思想,非常巧妙。我们可以借鉴这个思想,来解决非排序的问题,比如:如何在 O(n) 的时间复杂度内查找一个无序数组中的第 K 大元素? 这就要用到我们今天要讲的内容。 归并排序的原理 我们先来看归并排序(Merg

liyf2的博客 504

openEuler系统下安装Google Chrome浏览器全攻略(附依赖问题解决方案)

本文详细介绍了在openEuler系统上安装Google Chrome浏览器的完整指南,包括环境准备、多种安装方式、依赖问题解决方案及性能优化技巧。针对openEuler特有的软件生态和依赖管理机制,提供了实用的命令和配置方法,帮助用户克服安装过程中的常见障碍,实现流畅的Chrome使用体验。

hadoop5ranger的博客 1152

大语言模型(LLM)在组合优化中的新突破:LLM-LNS与FunSearch性能对比

本文深入探讨了大语言模型(LLM)在组合优化中的创新应用,重点对比了LLM-LNS与FunSearch两种方法的性能差异。研究表明,LLM-LNS在物流路径规划、资源调度等场景中展现出显著优势,其双层自演化架构能有效平衡探索与利用,相比传统方法提升效率约43%。文章还提供了实践选择指南,帮助开发者根据具体需求选用合适的技术方案。

weixin_42526415的博客 407

快排找第k大的数

题目描述给定一个长度为 n 的整数数列,以及一个整数 k,请用快速选择算法求出数列从小到大排序后的第 k个数。

m0_74120503的博客 373

华为OD机试真题新系统-空间占用计算(Py/Java/C/C++/Js/Go)

华为OD机试新系统机试真题 【空间占用计算】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【空间占用计算】。

qq_45776114的博客 3448

快速排序——寻找数组第K大数(由浅入深,四种方法对比讲解!)

寻找数组第K大数是大厂面试中经常考到的一题,有的小机灵鬼直接用sort()进行排序,两行代码解决,这样看似可行,实则掉入了出题人的陷阱!

不积跬步,无以至千里! 2万+

踩坑实录:C#上位机YOLOv11从2FPS到45FPS,ONNX Runtime GPU加速全解析

算力迁移:将推理核心从CPU迁移至GPU(核心提速手段);内存复用:避免重复分配/释放内存,减少GC压力;维度固定:工业场景固定输入分辨率,关闭动态维度;资源限制:合理限制GPU/CPU/内存占用,避免资源耗尽;解耦设计:推理线程与UI线程解耦,避免跨线程问题。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 575

从零开始学 AUTOSAR:深入浅出 SAE J1939 诊断通信管理器(J1939Dcm)深度完整版

SAE J1939 是美国汽车工程师学会制定的重型车辆 CAN 总线通信标准,覆盖卡车、客车、工程机械、农机、船舶等,是商用车领域的 “通用语言”。基于CAN 2.0B 扩展帧(29 位 ID)(车规主流)PGN(参数组号)+ SPN(可疑参数号)核心标准:J1939-21:数据链路层(CAN 帧格式、地址声明)J1939-71:应用层(普通信号、报文)诊断层(核心!J1939Dcm 依据)J1939-81:网络管理(地址管理、节点检测)

getusushu的博客 118

寻找第K大的数(快排思想)

使用快排思想找第K大的数,算法复杂度O(n)。1.以数组a的第0位a[0]为参考基准base,将数组划分为两个部分; 如果找第K大的数,则将大于base的数往前挪,将小于base的数往后挪。如果找第K小的数,则与此相反。 划分过程与快排相同,使用两个指针i和j分别指向数组的首尾,根据指针所指元素与基准base的大小交替移动两个指针,直到两个指针指向同一个位置i==j,此时i或j即为base的下标

诗酒年华 1万+

【C语言】程序员筑基功法——《函数栈帧的创建与销毁》

汇编角度带你走进函数栈帧

StackFrame 3663

每日刷题之(寻找第K大)快排

嘎嘎刷题

m0_60264772的博客 1131

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

快速排序查询第k大元素C语言,寻找第K大的数(快速排序的应用)

有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数。给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在。测试样例:[1,3,5,2,2],5,3http://blog.youkuaiyun.com/hymanxq/article/details/51026818public class 寻找第K大的数 {public static void main(...

weixin_42099942的博客 1046

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

快速找第k大/小的数模板

做题时经常会遇到直接或变相找第几大或第几小的问题,提供一个模板:即利用对快速排序的改造快速找到第k大/小的数; 先简单说一下快排的原理(会的直接跳过):分区。即挑出一个基准数,将比这个数小的数放在前面,比这个数大的数放在后面。这样完成一次分区。经过不断的分区来使每个数放到它该去的地方。详见两个博客:快速排序原理;单循环完成快速排序(后面这个是我用的快排) 快排的动图展示 再说说如何应用: 要找第k大的数,大多数人会选择先排好序再从后往前标记着寻找,但这样对于一些数据较大的题很...

bairimeng16的博客 1605

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

通过寻找第K大的数,分享一个快速排序的模板

题目:NC88 寻找第K大,来源牛客网 结合快排的图解,食用更佳。 题目描述 有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数。 给定一个整数数组a,同时给定它的大小n和要找的K(K在1到n之间),请返回第K大的数,保证答案存在。 示例1 输入 [1,3,5,2,2],5,3 返回值 2 package nowcoder.研发最爱考; /** * @Created by menghanjun * @Date 2021/2/26 11:32 上午 */...

LuvFeral的博客 192

NC88 寻找第K大(python) 快速排序

描述 有一个整数数组,请你根据快速排序的思路,找出数组中第K大的数。 给定一个整数数组a,同时给定它的大小n和要找的K(1<=K<=n),请返回第K大的数(包括重复的元素,不用去重),保证答案存在。 示例1 输入: [1,3,5,2,2],5,3 返回值:2 快速排序模板 class Solution: def quick_sort(self, a, start, end): if start >= end: # 递归的退出条件 retu

qq_38178543的博客 1079

区间第k大

区间第K大的数是哪个 问题描述 给定一个序列,每次询问序列中第l个数到第r个数中第K大的数是哪个。 输入格式 第一行包含一个数n,表示序列长度。 第二行包含n个正整数,表示给定的序列。 第三个包含一个正整数m,表示询问个数。 接下来m行,每行三个数l,r,K,表示询问序列从左往右第l个数到第r个数中,从大往小第K大的数是哪个。序列元素从1开始标号。 输出格式 总共输出m行,每行一个数,表示询问的答...

Tesla_meng的博客 440

快速排序算法及其思想的应用(寻找一个序列中第k小元素)

快速排序的本质就是通过特定的算法将一段无序的数列分割成独立的两部分,再对这两部分采用同样的算法递归处理,最终使得序列有序。 关键就在于这个特定的算法,具体实现起来,我们可以取序列中任意一个元素作为媒介,并把比其小的数字放在这个元素左边,把比其大的数字放在右边。 由于可以选取任意的元素作为媒介,所以快速排序就有了很多种不同的类型。 其中比较常见的就是把中间元素或第一个元素作为媒介。 第一种快排:把中间元素作为媒介 核心代码: 前面一部分主要是实现以第(l+r)/2 个元素作为媒介, 并将比其小的元素放在前面,

qq_50748356的博客 3548

【算法】快速排序(第k小的数)

2021.10.28 快速排序 参考文章: 快速排序法(详解)_小白的博客-优快云博客_快速排序假设对以下10个数进行快速排序:61279345108我们先模拟快速排序的过程:首先,在这个序列中随便找一个数作为基准数,通常为了方便,以第一个数作为基准数。61279345108在初始状态下,数字6在序列的第1位。我们的目标是将6挪到序列中间的某个位...https://blog.youkuaiyun.com/qq_40941722/article/details/94396010?ops_request_misc

nathanqian123的博客 1965

蓝桥杯基础算法(一)—— 快速排序

基础算法之快速排序

Edison's 小宇宙 2233

【Leetcode】大神总结的所有TopK问题模板(基于快速排序)

整个数组找基准正确位置,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面。

YaoYee_21的博客 1257

快速排序模板整理

快速排序 1.思想 快速排序是对冒泡排序的一种改进。它的基本思想是:通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。 假设待排序的序列为{ a[1],a[1+1], a[1+2],…a[r] },首先任意选取一个记录(通常可选中间一个记作为枢轴或支点),然后重新排列其余记录,将所有关键字小于它的记录都放在左子序列中,所有关键字大于它的记录都放在右子序列中。由此可以将该“支点"记录所在的位置mid作分界线,将序

林深不见鹿 的博客 1817

luogu_P1177 【模板】快速排序 (快排和找第k大的数)

【算法】   选取pivot,然后每趟快排用双指针扫描(l,r)区间,交换左指针大于pivot的元素和右指针小于pivot的元素,将区间分成大于pivot和小于pivot的 【注意】   时间复杂度取决于pivot的选取是否能把(l,r)区间分成长度相等的两个子区间。   最优:O(nlogn)  最差:O(n2)   问题解决: 版本一:pivot选择区间中间的元素可以...

173

快速排序 第k大数(模板)

快速排序 题目描述  给定你一个长度为n的整数数列。  请你使用快速排序对这个数列按照从小到大进行排序。  并将排好序的数列按顺序输出。 输入格式  输入共两行,第一行包含整数 n。  第二行包含 n 个整数(所有整数均在1~109范围内),表示整个数列。 输出格式  输出共一行,包含 n 个整数,表示排好序的数列。 数据范围  1≤n≤100000  1≤n≤100000 输入样例:  5  ...

qq_44754132的博客 473
上一篇: 【模板】冒泡排序
下一篇: 【模板】选择排序
coderwait
博客等级 码龄9年 20粉丝 210原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值