无序数组求第K大/第K小的数
方法一:quicksort
根据快排思想,从后往前找比基准数小的,交换位置。
从前往后找比基准数大的,交换位置。
最后安放基准数。
保证 l到p 是大数,若 p-l+1==k 那么p就是第K大
若 p-l+1<k 那么从 p+1 到 r 中 找 k-(p-l+1)大的数
若 p-l+1>k 那么从 l 到 p-1中 找第k大的数。
![](/assets/blank.gif)
![](/assets/blank.gif)
1 #include<iostream> 2 #include<cstdio> 3 #include<string> 4 #include<cstring> 5 #include<cmath> 6 #include<algorithm> 7 using namespace std; 8 int n, k; 9 int a[100010]; 10 int par(int l, int r) 11 { 12 int t = a[l]; 13 while (l < r) 14 { 15 while (l < r &&a[r] <= t) r--; 16 a[l] = a[r]; 17 while (l < r &&a[l] >= t) l++; 18 a[r] = a[l]; 19 } 20 a[l] = t; 21 return l; 22 } 23 int search(int l, int r,int k) 24 { 25 if (l <= r) 26 { 27 int p = par(l, r); 28 if (p - l + 1 == k) return p; 29 else if (p - l + 1 < k) return search(p+1,r,k-(p-l+1)); 30 else return search(l,p-1,k); 31 } 32 } 33 int main() 34 { 35 cin >> n >> k; 36 for (int i = 1; i <= n; i++) 37 cin >> a[i]; 38 cout << a[search(1, n, k)] << endl; 39 40 return 0; 41 }
View Code
方法二:最小堆
原本用swap函数的,后来好像swap并不能使两个数交换,以后我一定自己写。(鞠躬表示歉意)
搞了半天搞错了,还是挖坑吧。
![](/assets/blank.gif)
![](/assets/blank.gif)
1 #include<iostream> 2 #include<cstdio> 3 #include<string> 4 #include<cstring> 5 #include<map> 6 #include<algorithm> 7 #include<cmath> 8 using namespace std; 9 int n, a[11000],b,k; 10 void adjust(int i,int n) 11 { 12 int child = 2 * i; 13 while (child <= n) 14 { 15 if (child + 1 <= n && a[child] < a[child + 1]) 16 child++; 17 if (a[child] < a[i]) 18 break; 19 int t = a[child]; 20 a[child] = a[i]; 21 a[i] = t; 22 i = child; 23 child = 2 * i; 24 } 25 } 26 void dui(int n) 27 { 28 for (int i = n / 2; i >= 1; i--) 29 adjust(i, n); 30 } 31 int main() 32 { 33 cin >> n >> k; 34 for (int i = 1; i <= k; i++) 35 cin >> a[i]; 36 dui(k); 37 for (int i = 1; i <= n - k; i++) 38 { 39 cin >> b; 40 if (b < a[1]) 41 { 42 a[1] = b; 43 adjust(1,k); 44 } 45 } 46 cout << a[1] << endl; 47 return 0; 48 }
View Code
转载于:https://www.cnblogs.com/Kaike/p/9931294.html
无序数组求第K大/第K小的数相关推荐
- 无序数组求第k大的数 python_整数无序数组求第K大数
import java.util.Scanner; /** * 类似与求第k小的问题 * 求第k大相当于求第n-k+1小,n为数组长度 * * 著名的BFPRT算法可保证在线性时间内得到结果. * h ...
- 无序数组求第k大的数 python_【python刷题】寻找数组中第K大/小的数
使用堆 import heapq def findKthLargest(nums, k): stack = [] for num in nums: heapq.heappush(stack, num) ...
- 整数无序数组求第K大数(暴力|快排) - 滴滴出行2018校园招聘内推笔试-研发工程师
时间限制:1S 空间限制:32768K 题目描述: 给定无序整数序列,求第K大的数,例如{45,67,33,21},第2大的数为45 输入描述: 输入第一行为整数序列,数字用空格分割,如:45 67 ...
- 整数无序数组求第k大数
题目来自牛客网 https://www.nowcoder.com/practice/097ab63cffa847d89716f2ca8c23524f?tpId=90&tqId=30914&am ...
- 第K大/Top K及其简单实现
转载请注明出处:http://blog.csdn.net/u012469987/. 见网上第K大多数只给思路,没给实现,我就来填坑了. update 2017-09-23 有同学反馈说面试遇到这个题, ...
- 合并两个无序数组java_Java实现十大排序算法(上)
概念 概念解释稳定如果a原本在b前面,而a=b,排序之后a仍然在b的前面.不稳定如果a原本在b的前面,而a=b,排序之后 a 可能会出现在 b 的后面.时间复杂度对排序数据的总的操作次数,反映当n变化 ...
- 如何寻找无序数组中的第K大元素?
如何寻找无序数组中的第K大元素? 有这样一个算法题:有一个无序数组,要求找出数组中的第K大元素.比如给定的无序数组如下所示: 如果k=6,也就是要寻找第6大的元素,很显然,数组中第一大元素是24,第二 ...
- 面试官:海量无序数据,寻找第 K 大的数,越快越好
最近在参加阿里云举办的<第三届数据库大赛创新上云性能挑战赛--高性能分析型查询引擎赛道>,传送门: https://tianchi.aliyun.com/competition/entra ...
- 海量无序数据寻找第 K 大的数
前言 最近在参加阿里云举办的<第三届数据库大赛创新上云性能挑战赛--高性能分析型查询引擎赛道>,传送门:https://tianchi.aliyun.com/competition/ent ...
最新文章
- AI 2000上榜学者秦兵:走进计算机的情感世界
- NTP时间同步服务器报错:no server suitable for synchronization found
- python中二维数组的建立,输入和输出
- Python内存管理方式和垃圾回收算法解析
- 从 wiscKey 看 LSMtree 的不足
- json api_JSON模式在构建和部署API中的作用
- 前端学习(3010):vue+element今日头条管理--回顾
- python判断密码强度并输出_密码强度判断
- Visual studio 内存不足的解决方案(out of memory)
- linux symbol文件,[转] Linux文件系统之hard linksymbol link
- 如何理解JavaScript用三角函数计算鼠标与多个目标点的距离
- 【小程序项目分享】多功能抽签分组系统
- 随机森林算法原理解析
- 利用python编程,制作自己的游戏“外挂”!
- 海淀牙齿矫正:牙齿矫正的步骤
- 微信支付 django
- linux中的man命令总结
- win10 OCX控件的注册
- 白光干涉仪可以用于测量化妆品用的云母材料?
- HTML5 weui笔记
热门文章
- (二)为AI模型训练准备影像
- RequireJS简单教程
- SQL的TRUNCATE和DELETE
- Ubuntu 19.10 停止支持 32 位的 x86 架构
- LINQ to CSV,一种类型安全,动态的高性能方法
- 简述python_简述Python语言经验总结
- matlab里vpa怎么用_“学校里的师兄师姐,用英文怎么说?”
- htt:// ************不在以下 request 合法域名列表中,请参考文档:******************************
- 复习vue笔记第一天
- html触摸电脑ui系统,如何用高级UI制作触摸系统界面