算法导论:快速找出无序数组中第k小的数

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情

题目描述:

给定一个无序整数数组,返回这个数组中第k小的数。

解析:

最平常的思路是将数组排序,最快的排序是快排,然后返回已排序数组的第k个数,算法时间复杂度为O(nlogn),空间复杂度为O(1)。使用快排的思想,但是每次只对patition之后的数组的一半递归,这样可以将时间复杂度将为O(n)。

 在《算法导论》有详细叙述 这里主要用C++实现,实现思路就是先选取当前数组的第一个数作为“主轴”,将后面所有数字分成两部分,前面一部分小于“主轴”,后面一部分大于“主轴”,然后计算前面一部分数字的有多少,如果大于K则递归--在前面一部分找第K个数,如果小于K则在后面一部分呢找,此时K要更新一下 K需要减去第一部分数字数目,递归查找。递归的细节自己掌握以下就行,思路基本就是这样。

代码实现:

#include <iostream>
#include <string>
#include <cstring>
#include <vector>
#include <algorithm>

using namespace std;

/*
题目描述:
给定一个无序整数数组,返回这个数组中第k小的数。
实现思路: 就是先选取当前数组的第一个数作为“主轴”,将后面所有数字分成两部分,前面一部分小于“主轴”,后面一部分大于“主轴”,然后计算前面一部分数字的有多少,如果大于K则递归--在前面一部分找第K个数,如果小于K则在后面一部分呢找,此时K要更新一下 K需要减去第一部分数字数目,递归查找
 */

void swap(int *p, int *q)
{
    int t;
    t = *p;
    *p = *q;
    *q = t;
}

int findNumberK(vector<int> &vec, int k, int s, int e)
// 快速排序(折半缩小递
据结构与算法】寻找无序数组中第K大的 寻找无序数组中第K大的方法1:排序法方法2:插入法方法3:小顶堆法方法4:分治法 部分参考: 漫画:寻找无序数组的第K大元素 方法1:排序法 方法2:插入法 方法3:小顶堆法 方法4:分治法 ... 阅读详情

相关推荐

不排序,两种方法找到无序数组的最大K个

虽然不排序,这这两种方法都源于经典的排序算法的扩展   方式一,快速排序的扩展 /************************************************************************/ /*找到无序数组中最大的k个 */ /**********************************************************

潇洒程序员的专栏 7121

面试题—— 找出一个无序整型数组中第k大的

面试题—— 找出一个无序整型数组中第k大的

艾斯 1万+

Shopee动态参x-sap-Ri与x-sap-Sec逆向解析实战

现代电商前端反爬普遍采用动态参校验机制,其核心是将设备指纹、DOM状态与时间上下文耦合生成不可复用的请求凭证。x-sap-Ri本质是渲染上下文唯一标识,依赖真实浏览器环境中的DOM树结构、Canvas像素指纹及毫秒级时间扰动;x-sap-Sec则是基于该标识与服务端同步密钥生成的HMAC-SHA256签名,具备强时效性与密钥轮换特性。这类机制显著提升了自动化采集门槛,广泛应用于Shopee商品详情页等高价值据接口。本文聚焦于从Chrome DevTools调试出发,系统还原参生成逻辑,覆盖DOM一致性

weixin_30603633的博客 799

无序数组中求第K小的

bfprt算法的讲解以及使用bfprt算法和改写快排两种方法解决“无序数组求第K小的”问题

明朗晨光的专栏 1108

【每日一题】无序数组最小的第 k 个

一个无序数组中,求最小的第 k 个

junxinsiwo的专栏 649

无序数组的第K(大/小)的三种方法

题目描述:给定一个无序数组(长度为n)和一个正整 K,让你求此数组中第K大的 方法1:最简单的思路,你肯定会想到 先把数组排序,然后再取下标为K的对应数组元素。这种方法肯定是可行的,但是这种方法无端的对咱们不需要查找的元素也进行了处理,在一定程度上增加了算法的消耗!这样是不值得的!此方法的平均时间复杂度为O(n*logn). 方法2:利用堆调整算法的性质,建立一个大小为K的堆,然后将整个...

liuwq012的专栏 8776

快速选择算法——求解第k小的

给定n个无序,求出其中第k小的

qq_33880925的博客 824

bfprt算法——无序数组中求第K小的

package com.harrison.class18; import java.util.Comparator; import java.util.PriorityQueue; /** * @author Harrison * @create 2022-03-30-19:29 * @motto 众里寻他千百度,蓦然回首,那人却在灯火阑珊处。 */ public class Code01_bfprt { public static class MaxHeapComparator im

Harrison的学习博客 1159

寻找无序数组中第k大的

对于一个无序数组,怎样找到其中第k大的呢?下面总结几种方法。1.直接排序法使用常见的归并排序、堆排序等算法对数组进行排序,然后找到第k大的。排序算法的时间复杂度为O(nlogn),所以算法总的时间复杂度为O(nlogn)。// Simple C++ program to find k'th biggest element #include<iostream> #include<algorith

好记性不如烂笔头 1万+

【LeetCode】快排-无序数组中找第k大的(或者最小的k个)

一个有代表性的题目:无序数组中找第k大的,对快排进行优化。 这里先不说这个题目怎么解答,先仔细回顾回顾快排,掰开了揉碎了理解理解这个排序算法:时间复杂度、空间复杂度;什么情况下是复杂度最高的情况。 1.主要思想 通过一趟排序将要排序的据分割成独立的两部分,其中一部分的所有据比另一部分的所有据要小,再按这种方法对这两部分据分别进行快速排序,整个排序过程可以递归进行,使整个据变成有序序列。 快排是冒泡排序的改进,改进点:冒泡排序每次只能交换相邻的两个元素,而快速排序是跳跃式的交换,交换的

凝眸伏笔的博客 9370

数组:如何找出数组中第k个最小

问题描述: 给定一个无序数组,从一个数组找出第k个最小,例如,数组{ 1,5,2,6,8,0,6 }, 其中第4小的为5 思路分析: 方法一:排序法 最数组进行排序,排序后的第k-1个位置上的字即为数组的第k个最小,时间复杂度为O(nlogn) 方法二:剪枝法 采用快速排序的思想来实现。选一个 tmp = a[n-1] 作为枢纽, 把比他小的都放在他的左边,比他大的...

weixin_38108266的博客 8242

【leetcode】找出数组的第k大的

用快排,原始的快排 def quick_sort(nums,l,r): if l<=r:return tmp = nums[0] while l<r: while l<r and nums[r]>tmp: j-=1 nums[j],nums[i]=nums[i],nums[j] ...

littlemichelle 6708

无序数组第 K 大的

规定,第一维据从小到大,第一维据一样的,第二维数组也从小到大。一组,不足一组的补齐一组,并对每组进行排序(由于固定是5个一组进行排序,所以排序的时间复杂度。),取出每组的中位,组成一个新的数组, 对新的数组求其中位,这个中位就是我们需要的值。的过程, 这个过程随机选择数组中的一个,假设叫pivot,这个过程主要作用是将数组的。大的,接下来的元素继续入堆,但是每入一个就弹出一个,最后,堆顶元素就是整个数组的第。返回两个值,一个是左边界和一个右边界,位于左边界和右边界的值均等于。

Practitioner 2256

java求无序数组中第k大的

无序数组中第k大的 最近工作不是很紧,闲下来学习巩固一下,看到一道面试题,解一下,main方法运行成功, public static void main(String[] args) { int[] a = {62,35,3,78}; int k = 2; int num = 0; for(int i = 0; i<a.length;i++){ if(a[i]>a[k]) { ...

weixin_44859876的博客 858

算法导论--在无序数组中选择第k小个

一个无序的整型数组中选出第k小的,如k=1最小,k=n为最大。这里数组可以是有重复的值! 下面是自己写的一个,记在此处来记忆我留下的痕迹!   //选择无序数组中第k小的 #include using namespace std ; bool failed = false ; //这里只考虑数组是int型的 int findnumber(int *array,in

liao272549164的专栏 719

算法-在有序数组无序数组中进行折半查找和二分法找无序数组中第k小(大)的

             折半查找又称为二分查找或对分查找。 (1)基本的二分查找 使用条件: 1. 线性表中的记录必须按关键码有序。 2. 必须采用顺序存储结构。 基本思想: 在有序表中,取中间记录作为比较对象, 若给定值与中间记录的关键码相等,则查找成功。 若给定值小于中间记录的关键码,则在中间记录的左半区继续查找; 若给定值大于中间记录的关键码,则在中间记录的右半区继续查...

Microstrong 6543

找出无序数组第K大/小数的方法(Leetcode 215)

上一篇博客讲解了找出无序数组中位的方法,找无序数组第K大的方法跟中位的方法差不多,K值可以类比成中位的值,所以方法还是差不多的,分别是1.排序+取值 2.快排思想 3.桶排序。上一篇博客详细讲了这三种方法。在这里附上上一篇博客的链接:找出无序数组中位的方法 这里我们以Leetcode中215题为例进行讲解 1 排序+取值 这个方法就不多说了。 2 快排思想 这里主要说一下快排哨兵元素选...

zamaochick的博客 885

找出数组中第k大的

给定一个数组找出数组中第k大的。其实现代码如下: package com.threeTop.www; /** * 找出数组中第k大的 * @author wjgs * */ public class FindK { public static void find(int[]array,int begin,int end,int k) { int i=partition

ZCC的专栏 2222

无序数组中找第k大的

原文地址:http://blog.sina.com.cn/s/blog_54f82cc201013tke.html 写一段程序,找出数组中第k大小的,输出所在的位置。 【解法一】 我们先假设元素的量不大,例如在几千个左右,在这种情况下,那我们就排序一下吧。在这里,快速排序或堆排序都是不错的选择,他们的平均时间复杂度 都是 O(N * log2N)。然后取出前 K

zr459927180的博客 2389

无序数组中找第K大的

类快排算法 leetcode215 由于只要求找出第k大的,没必要将数组中所有值都排序。 典型解法:快速排序分组。 在数组中找到第k大的元素 取基准元素,将元素分为两个集合,一个集合元素比基准小,另一个比基准大 ,三种情况。 1.比基准大的元素目标志位m正好为k-1,基准就是目的元素。 2.比基准大的元素标志位m小于k, 那么就在比基准小的集合里面找第(k-m)大的元素 3.若是比基准大的元素为m大于k,那就继续在该集合里面找第k大的元素。 快排中的partition算法,返回key在数组中的

juluwangriyue的博客 2958
上一篇: 哈夫曼树(最优二叉树)及哈夫曼算法
下一篇: 算法导论:回文子串(Manacher)算法 ,O(n)时间效率实现
tham_
博客等级 码龄12年 233粉丝 105原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值