快速查找无序数组中的第K大数?
1.题目分析:
查找无序数组中的第K大数,直观感觉便是先排好序再找到下标为K-1的元素,时间复杂度O(NlgN)。在此,我们想探索是否存在时间复杂度 < O(NlgN),而且近似等于O(N)的高效算法。
还记得我们快速排序的思想麽?通过“partition”递归划分前后部分。在本问题求解策略中,基于快排的划分函数可以利用“夹击法”,不断从原来的区间[0,n-1]向中间搜索第k大的数,大概搜索方向见下图:
2.参考代码:
1 #include <cstdio> 2 3 #define swap(x,y){int temp=x;x=y;y=temp;} 4 5 using namespace std; 6 7 8 9 const int maxn=1e5; 10 11 int a[maxn]; 12 13 14 15 int part(int *arr,int p,int q){ 16 17 int i=p-1; 18 19 for(int j=p;j<q;j++) if(arr[j]<a[q]){ 20 21 i++; 22 23 swap(arr[i],arr[j]); 24 25 } 26 27 i=i+1; 28 29 swap(arr[i],arr[q]); 30 31 return i; 32 33 } 34 35 int findK(int *arr,int n,int k){ 36 37 int p=0,q=n-1; 38 39 while(p<q){ 40 41 //int m=p+(q-p)/2; 42 43 int f=part(arr,p,q); 44 45 //printf("f=%d\n",f); //for tested 46 47 if(f==k){ 48 49 return arr[k]; 50 51 }else if(f>k){ 52 53 q=f-1; 54 55 }else{ 56 57 p=f+1; 58 59 } 60 61 } 62 63 return arr[k]; //needed 64 65 } 66 67 int main(){ 68 69 int n,k; 70 71 /* 72 73 *input includes 2 integers. n indicates the num of elements , 74 75 *k means for the kth larger num to be found 76 77 */ 78 79 while(scanf("%d%d",&n,&k)==2){ 80 81 for(int i=0;i<n;i++) scanf("%d",&a[i]); 82 83 int ans=findK(a,n,k-1); 84 85 printf("%d\n",ans); 86 87 } 88 89 return 0; 90 91 } 92 93 /* 94 95 data for the test: 96 97 4 2 98 99 1 5433 11 2 100 101 4 3 102 103 1 5433 11 2 104 105 4 4 106 107 1 5433 11 2 108 109 */ 110 111
3.测试结果:
结语:
本算法实现仅适用常规情况,如果K=1或2聪明的你应该要知道不必套用本文的算法,简单遍历保存最大即可,所以说具体问题还得具体分析^_^
转载于:https://www.cnblogs.com/SeaSky0606/p/4572852.html
快速查找无序数组中的第K大数?相关推荐
- 无序数组中找第K大的数
类快排算法 leetcode215 由于只要求找出第k大的数,没必要将数组中所有值都排序. 典型解法:快速排序分组. 在数组中找到第k大的元素 取基准元素,将元素分为两个集合,一个集合元素比基准小,另 ...
- 如何寻找无序数组中的第K大元素?
如何寻找无序数组中的第K大元素? 有这样一个算法题:有一个无序数组,要求找出数组中的第K大元素.比如给定的无序数组如下所示: 如果k=6,也就是要寻找第6大的元素,很显然,数组中第一大元素是24,第二 ...
- 单峰数组找最大元素C语言,查找单峰数组中的第k个元素
给定一个n个不同元素的单峰数组A(意味着它的条目按递增顺序排列直到其最大元素,之后其元素的递减顺序),则整数p (即增加的第一部分的长度)和k(第k个最小元素)给出算法以计算在O(log n)时间中运 ...
- 【算法】数组与矩阵问题——找到无序数组中最小的k个数
1 /** 2 * 找到无序数组中最小的k个数 时间复杂度O(Nlogk) 3 * 过程: 4 * 1.一直维护一个有k个数的大根堆,这个堆代表目前选出来的k个最小的数 5 * 在堆里的k个元素中堆顶 ...
- 小米笔试题:无序数组中最小的k个数
题目描述 链接:https://www.nowcoder.com/questionTerminal/ec2575fb877d41c9a33d9bab2694ba47?source=relative 来 ...
- 找出无序数组中最小的k个数(top k问题)
2019独角兽企业重金招聘Python工程师标准>>> 给定一个无序的整型数组arr,找到其中最小的k个数 该题是互联网面试中十分高频的一道题,如果用普通的排序算法,排序之后自然可以 ...
- python:无序数组中寻找第K大的元素
题目: 所谓"第(前)k大数问题"指的是在长度为n(n>=k)的乱序数组中S找出从大到小顺序的第(前)k个数的问题. 解法1:堆排序 采用元素下沉法,维护一个k大小的最小堆, ...
- 算法设计--查找无序数组中第K大的数字
给出一个数组,要求查找出这个数组中按顺序排第K大的数字. 思路:利用快速排序的思想,把数组中的元素分治,并计算中间值的位置,如果是K,则这个数就是第K大的数字,如果比K小,那么再次利用快速排序分治中值 ...
- 查找无序数组中第K大的数
思路: 利用快速排序的划分思想 可以找出前k大数,然后不断划分 直到找到第K大元素 代码: #include <iostream> #include <algorithm> # ...
最新文章
- 防抖 节流_每日一题手写函数防抖与节流
- CMake结合Visual Studio中开发Qt应用程序注意事项
- Heartbeat,来点真的
- Python3系列__01Python安装
- Docker镜像的创建、存出、载入
- Unity 工具 之 常用插件分类汇总(UI/VR/AR/建模/Shader/动画/网络/AI/资源/数据/区块链等)
- ubuntu(乌班图)常用命令大全
- get请求中url传参中文乱码问题
- php url 转码,php url中文转码的方法
- 华为外包公司一面二面三面回顾
- 三消类游戏的核心算法
- 师董正伟:商务部受理微软涉垄断案
- 在华为云服务器安装libreoffice软件
- 新品发布 | P600准行业无人机研发平台,室外视觉识别跟踪、激光雷达避障、多机组网!
- 99.扩展.霍尔三维结构方法论 vs 切克兰德方法论
- format函数python生成列表_python 全栈开发,Day14(列表推导式,生成器表达式,内置函数)...
- 如何更新R以及RStudio
- 修改定位工具相关的app
- 利用python脚本自动发布服务之arcmap篇
- 轩辕剑-天之痕java_轩辕剑天之痕,芦家渡的宝藏当年有多少玩家得到过?
热门文章
- exchange 2010 集线器(hub)外发邮件的配置
- Web UI 制作规范
- 查询GC得到森林里主域和子域的帐号
- 苹果如果无法弹出⏏️
- 剑桥MPhil Industrial Systems, Manufacture and Management录取率
- 吹爆google colab
- 【转】Luajit-2.1.0-beta1的发布和生成arm64用bytecode的解脱
- mysql按某一字段分组取最大(小)值所在行的数据
- 第三次作业:阅读《构建之法》1-5章有感
- reactJS -- 9 组件的Refs(操作DOM的两种方法)