求数组的第K小数,O(nlogn) 和 O(N)的算法

数组第K小的数 1.1 题目描述 查找一个数组的第K小的数,注意同样大小算一样大。 如 2 1 3 4 5 2 第三小数为3。 输入描述: 输入有多组数据。 每组输入n,然后输入n个整数(1<=n<=1000),再输入k。输出描述: 输出第k小的整数。输入例子: 6 2 1 3 5 2 2 3输出例子: 3方案1:对数组进行排序,然后找出第k小的数字 时间复杂度O(nlogn), 空间复杂度O 阅读详情

在面试中碰到求数组中第K小的数,(或者最小的的K个数)。


最直观的方法是排序之后,选择数组A的元素A[K-1];  以快速排序为例,排序的时间复杂度为O(NlogN), 选择元素的时间为O(1)。

如果允许使用额外空间,则排序算法可以使使用时间复杂度为O(N)的基数排序。


如果时间复杂度要O(N), 不使用额外空间的话,可以借用快速排序中partition函数来达到想要的结果。

思路是:

在经过partion之后,会得到一个位置(索引)position, 该位置左边的元素都小于position位置的值,右边的都大。

1, 当 postion == K -1时, 该位置元素为所求

2, 当postion < K - 1时,说明应该去postion的右边去找

        3, 否则,去左边找


下边来一个栗子:

求自定类型元素序列的中位数 

本题要求实现一个函数,求N个集合元素A[]的中位数,即序列中第\lceil N/2 \rceil⌈N/2⌉大的元素。其中集合元素的类型为自定义的ElementType。

函数接口定义:

ElementType Median( ElementType A[], int N );

其中给定集合元素存放在数组A[]中,正整数N是数组元素个数。该函数须返回N个A[]元素的中位数,其值也必须是ElementType类型。

裁判测试程序样例:

#include <stdio.h>

#define MAXN 10
typedef float ElementType;

ElementType Median( ElementType A[], int N );

int main ()
{
    ElementType A[MAXN];
    int N, i;

    scanf("%d", &N);
    for ( i=0; i<N; i++ )
        scanf("%f", &A[i]);
    printf("%.2f\n", Median(A, N));

    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例:

3
12.3 34 -5

输出样例:

12.30

解答:

注意事项: 根据题目对中位数的定义, 在数据量为偶数的时候, 我们需要的是中间两个数中右边的那一个,而不是两个元素的中指


代码:

#include <stdio.h>

#define MAXN 10
typedef float ElementType;

ElementType Median(ElementType A[], int N);

int main(){
	ElementType A[MAXN];
	int N, i;
	scanf("%d", &N);
	for(i=0; i<N; i++)
		scanf("%f",&A[i]);
	printf("%.2f\n", Median(A,N));
	// printf("Test:\n");
	// for(int i = 0; i < N; ++i){
	// 	printf("%f ", A[i]);
	// }
	return 0;
}

void swap(ElementType A[], int i, int j){
	// printf("Swaped! ");
	ElementType temp = A[i];
	A[i] = A[j];
	A[j] = temp;
}

int partition(ElementType A[], int N, int left, int right){
	// printf("reached! %d %d ", left, right);
	ElementType pivot = A[right];
	int index = left - 1;
	for(int i = left; i < right; ++i){
		if(A[i] < pivot) swap(A, ++index, i);
	}
	swap(A, ++index, right);
	return index;
}

// 查找N个元素中的第K个小的元素(来自编程珠玑)
ElementType Median(ElementType A[], int N){
	// printf("reached! ");
	int position = -1, left = 0, right = N - 1;
	int target = N / 2;
	// if(N % 2 == 0) --target; 
	// if(position == target) return A[target];
	while(1){
		if (position < target) {
			left = position + 1;
			position = partition(A, N, left, right);
		}
		else if(position > target){
			right = position - 1;
			position = partition(A, N, left, right);
		}
		else {
			// printf("position: %d ", position);
			return A[position];
			// break;
			// return position;
		}	
	}
}











快速选择算法:高效查找第K大元素的原理与实践 在数据处理领域,快速选择算法是基于分治思想的高效查找技术,专门用于解决无序数组中第K大或前K小元素的查找问题。与传统的O(nlogn)排序方法相比,该算法通过类似快速排序的partition操作,平均时间复杂度可优化至O(n)。其核心价值在于处理大规模数据时的性能优势,例如千万级用户行为分析或实时Top K计算场景。算法通过随机化pivot选择和递归处理单侧子数组,结合工程优化如小数组插入排序和尾递归消除,能显著提升处理效率。实际应用中,该技术可扩展至海量数据处理,配合堆结构实现内存友好的流式处理方案。 阅读详情

相关推荐

Office 365部分安装及同时安装Visio的方法

From MWeb Win版本的Office 365安装包默认安装所有组件,没有选择的页面,在安装Office 365后再安装下载的Visio 2016专业版时,会显示计算机上已经安装了即插即用Office,Visio不可安装,因此可以考虑使用Office部署工具来解决这两个问题。 下载安装Office365和Visio 下载Office部署工具 修改配置 部署工具使用方法...

weixin_30737363的博客 2万+

求第k小的数 O(n)复杂度

思路:利用快速排序的思想,把数组递归划分成两部分。设划分为x,数组左边是小于等于x,右边大于x。关键在于寻找一个最优的划分,经过 Blum 、 Floyd 、 Pratt 、 Rivest 、 Tarjan五位大牛的研究总结,提出了BFPRT 算法(也就是中位数的中位数算法),利用中位数的中位数算法得到的数作为划分可以实现最优划分--在最差情况下能实现O(n)复杂度。接下来考虑可能出现许多重复...

weixin_30794491的博客 211

Wireshark 4.6 TCP 流图解析:3种拥塞控制算法可视化对比

本文深入解析Wireshark 4.6的TCP流图功能,通过可视化对比Reno、Cubic和BBR三种主流拥塞控制算法的性能特征。文章提供详细的实验环境搭建方法、流图分析工具使用技巧,以及算法调优建议,帮助网络工程师优化TCP性能。

weixin_29291573的博客 448

算法:在两个有序数组中找整体第k小的数

给定两个已经排序的数组(假设按照升序排列),然后找出第K小的数。比如数组A = {1, 8, 10, 20}, B = {5, 9, 22, 110}, 第 3 小的数是 8.。要求时间复杂度O(logN),空间复杂度O(1)。 实现如下: 在上面的程序里,我们是逐一比较数组A 和数组B的值,但是,这样做还是太慢了,因为两个数组是已经排过序的,我们完全可以利用二分查找的方法来解决这样的问题。二分算法的思路是:通过不断的缩小问题的规模,也就是元素的查找范围,来提升算法的执行效率。在具体介绍怎么做之前,先讲一

OceanStar的博客 1556

从零开始开发AI Agent:基于大模型的智能体实战指南

### 摘要 本文介绍了AI Agent的开发全流程,从基础概念到实际部署,涵盖大模型集成、工具调用和记忆系统构建等核心技术。通过电商客服案例展示实战应用,并提供调试优化与部署方案,最后展望了AI Agent的未来发展方向,帮助开发者快速掌握智能体开发技能。

ghs_gss的博客 4868

Dify 系列教程 | 第 6 篇:工作流入门 -- 用可视化方式编排 AI 逻辑

Dify 工作流是一个基于有向无环图(DAG)的可视化 AI 逻辑编排系统。你可以把多个处理步骤(节点)用连线串联起来,数据从起点流向终点,每经过一个节点就被处理一次。用一个类比来理解:如果单次 Prompt 调用是"一道菜",那工作流就是"一道完整的生产线" – 原材料(输入)进入流水线,经过清洗(预处理)、切配(数据转换)、烹饪(AI 推理)、装盘(格式化输出)等工序,最终产出成品。创建一个工作流类型的应用(或高级聊天类型),就会进入工作流编辑器。编辑器基于ReactFlow构建(

weixin_43674738的博客 121

求数组中第k个最小数

求数组中第k个最小数 一、问题描述 给定一个数组,数组中的数据无序,在一个数组中找出其第k个最小的数,...

weixin_44602007的博客 1014

FPGA上的时间数字转换器(TDC):详细概述及FPGA开发

本文对基于FPGA的时间数字转换器(TDC)进行了详细的概述,并提供了一个简单的示例代码,展示了如何在FPGA上实现TDC功能。在本文中,我们将详细概述基于FPGA的TDC,并提供相应的源代码示例,以帮助读者理解和实现这一功能。需要注意的是,这只是一个简单的示例,实际的TDC设计可能需要更多的功能和优化,以满足特定的需求。读取和重置:最后,测量结果可以通过读取计数器的值来获取,并且在每次读取后需要将计数器重置为零,以便进行下一次测量。TDC的基本原理是测量信号的到达时间与参考时钟之间的时间差。

EsqpWeller的博客 6870

找数组中第k个最小数

一、面试问题描述 给定一个若干个学生的分数数组,数组中的分数是无序的,在该数组中找出其第K个最小的数,例如对于分数数组arr,arr={89,67,69,60,88,83,75,56,96},则其第3个最小的数为67。 二、解题思路 算法跟快排的思路相似,首先在数组中选取第一个数x=arr[0]为划分的基准,将比x小的数,放到x的前面。将比x大的数,放到x的后面。如果此时x的位置刚好为k,则

jasonjwl的专栏 1080

一步一步教你如何安装IP-Guard(客户端WINDOWS篇)

1、安装完服务器后,在服务器右下角有一个IP-GUARD图标:如图 2、点图标右键选注册: 3、注册成功后, 4、在开始菜单里选生成客户端安装包。 5、生成客户端安装包成功,安装名字可以任意,但是最好是英文名字。 6、将客户端安装程序复制到桌面。 7、退出所有杀毒软件、安全卫士、电脑管家等然后运行 8、安装完成后,立即重启计算机。IPguard客户端安装完成。 9、这样在控制里就可以看到已经安装客户端的计算机,在线显示蓝色,灰色表示计算机已经离线货关机 ...

IP-Guard专栏 5631

SimSwap复现指引及代码分析【2023有更新】

我的环境!!!😚😚😚 之后会遇到:还会遇到至此环境配置完毕!下面是所需要的checkpoint。至此环境准备结束。先试试环境是否有问题,图片是代码包中给的。我用的是512的checkpoint,无水印,a是源脸,b是目标脸。输出到./output/result_whole_swapsingle.jpg 如图是可以成功换脸的:(为了方便查看将图像裁剪到了128x128) 表示图像预处理,相应的改为也是一样。不加就是对已经面部对齐的图像进行简单的面部交换。 加上就是无水印。 交换一张图片中的所有面孔。

zik的博客 2050

【算法实验一】--【递归分治法】--求第k小数

1574.求第k小数 时限:1000ms 内存限制:10000K  总时限:3000ms 描述 求第k小数   输入 先输入一个小于10000的正整数n,再输入n个整数,最后输入一个小于等于n的正整数k,   输出 输出其中第k小的数。   输入样例 5 2 98 34512 8492 1000 2   输出样例 98 解析:这是个线性时间选择题,基本思想是分治和递...

杨的博客 1286

芒果YOLOv7改进48:主干篇:独家首发改进:目标检测新范式骨干PPHGNetv2改进版,充分融合信息特征,提升YOLOv7检测能力

YOLOv7代码改进实践 | 独家首发改进 PPHGNetv2 改进版结构

包括YOLOv5、YOLOv7、YOLOv8等模型改进 1851

STL数组第k小数函数

在一个数组中,要找第k小数,很多人的第一反应应该都是sort然后直接输出。但是昨天就被5e6卡了nlogn,这时候,stl里的一个函数就可以上场了:nth_element() 这个函数有四个参数: 1.first 容器开始位置 2.nth 要找的第k小(大)元素 3.last 容器结束位置 4.cmp 同sort,默认升序 该函数唯一能保证的就是第k小(大)元素在所选容器区间的第k个位置。不过拥有O(n)O(n)O(n)的复杂度。 函数结束之后,在k位置之前的数都小于第k的元素,在k位置之后的数都大于第k的

陈颜的博客 5411

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

手把手教你用树状数组+二分解决CCPC‘小y爱数数’:从暴力O(n²)到O(nlogn)的优化之路

本文详细解析了如何利用树状数组与二分查找优化CCPC竞赛题目'小y爱数数'的解法,将时间复杂度从O(n²)降至O(nlogn)。通过数学分析、数据结构应用和实战代码演示,帮助算法竞赛选手掌握高效解题技巧,提升竞赛表现。

weixin_30652491的博客 413

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

【算法宝典】序列中第k小的数问题

目录第k小数<1> 第k小数<1> 这个问题看似比较简单,直接排序就可以了嘛!但是 最好的排序算法的复杂度是O(nlogn)的,我们可以用一种方法使得不用排序在O(n)的时间内解决问题。 这里用到了指针的思想,注意我们只用到了思想,但是并没有真的使用到指针。 #include<iostream> #include<fstream> #include...

斯坦福-MIT-Harvard-CMU 548

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

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

输入n个整数,找出最小的k个数

题目描述:输入n个整数,找出其中最小的K个数 例如输入4,5,6,1,2,3,7,8这8个数字 则最小的4个数字是1,2,3,4 方法一:对数组进行排序 时间复杂度O(nlogn) import java.util.ArrayList; import java.util.Arrays; public class GetLeastNumbers { public static Ar...

qq_44929652的博客 1919

算法:数组上二分问题

有序数组旋转一次后的最值: 例如,4 5 6 7 1 2 3 二分搜索,平均O(logN),最差O(N) 如果num[low] = = num[mid] = = num[high] num[i++] 向右遍历,寻找下一个可以二分的点。 三种情况: 1,num[low] > num[i] , num[i] 就是断点 2,num[low] < num[i] , 断点在num[i … mid...

ShellDawn的博客 294

牛客补题第k小

第k小数 求第K小,一般解法:sort之后直接输出,但是5e6卡nlogn,可以用nth_element,On找出第k小个数 AC代码: ll a[5000010]; int main() { IOS; ll t; cin>>t;; while (t--) { ll n, k; cin>>n>>k; for (int i=1;i<=n;i++) cin&

陈颜的博客 3656

poj 2761 线段树(多次查询不覆盖区间的第k小数)

题意:给定n个数,m次查询(a,b,k),表示查询第a个数到第b个数(闭区间[a,b])中的第k小数。其中这m个区间保证没有一个完全覆盖另外一个。 思路:首先考虑没有区间覆盖的意思:对于最小的区间终点,它对应的起点一定是最小的区间起点。首先离散化。然后使用线段树,每个节点(如表示区间为[a,b])维护一个值small表示位于其左儿子的个数。然后对于每个区间(对区间先排序)更新查询即可。时间复杂度

dearmango 756

第k小个数和第k大个数,5种方法,速看!!!

1.第k小个数 地址:链接地址 1.1时间复杂度O(n) 1.1.1基于快排实现 将k值当做物理地址的值,比如第5个数其实就是数组4的位置,第2个数就是数组1的位置 每次只需要判断k在左区间还是右区间,一直递归查找k所在区间 最后只剩一个数时,只会有数组[k]一个数,返回数组[k]的值就是答案 描述 将k值当做物理地址的值,比如第5个数其实就是数组4的位置,第2个数就是数组1的位置 每次只需要判断k在左区间还是右区间,一直递归查找k所在区间 最后只剩一个数时,只会有数组[k]一个数,返回数组[k]的值就

福尔摩东的博客 1515

day34 K次取反后最大化的数组和 加油站 分发糖果

汽车油箱容量无限,从第i个加油站开往第i+1个加油站需消耗cost[i]升汽油,开始油箱为空。每个孩子至少分配一个糖果,相邻两个孩子评分更高的获得更多糖果,至少需要准备糖果的数量。将整数数组nums[i]中某个元素替换为nums[i]重复k次,返回可能的最大和。若可以顺序绕环路一周,返回出发的加油站编号,否则返回-1,解唯一。环路上有n个加油站 第i个加油站有汽油gas[i]升。

qq_43773652的博客 1052

分治2--第k小数

第k大数 思路1: 排序+直接读取下标 O(nlogn) 思路2: 快排的近似,最差O(n^2), 理想O (n) #include<iostream> using namespace std; int position(int arr[], int left, int right){ int p = left; int q = right; int mid = arr[left]; while(p <= q){ while(p <= q &&am

weixin_44227389的博客 292

【ybt金牌导航6-1-1】第 k 小数

求序列中第 k 小的数。 不能 nlogn 做。

欢迎您的光顾awa 229

算法竞赛实战:如何根据数据范围快速选择高效算法

本文详细解析了在算法竞赛中如何根据数据范围快速选择高效算法以避免TLE(时间超出限制)。通过实际案例和对照表,介绍了不同数据规模下适用的时间复杂度及典型算法,帮助参赛者优化代码性能,提升竞赛表现。

h0i1j2k3l的博客 640

Notes of PTA assignments in week 2

Q1 找第k小的数 设计一个平均时间为O(n)的算法,在n(1<=n<=1000)个无序的整数中找出第k小的数。 提示:函数int partition(int a[],int left,int right)的功能是根据a[left]~a[right]中的某个元素x(如a[left])对a[left]~a[right]进行划分,划分后的x所在位置的左段全小于等于x,右段全大于等...

BEIBEI_2011的博客 425
上一篇: 阶乘计算升级版(大整数)
下一篇: 5-1 厘米换算英尺英寸 (15分)
小李34234324
博客等级 码龄16年 3粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值