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大数?相关推荐

  1. 无序数组中找第K大的数

    类快排算法 leetcode215 由于只要求找出第k大的数,没必要将数组中所有值都排序. 典型解法:快速排序分组. 在数组中找到第k大的元素 取基准元素,将元素分为两个集合,一个集合元素比基准小,另 ...

  2. 如何寻找无序数组中的第K大元素?

    如何寻找无序数组中的第K大元素? 有这样一个算法题:有一个无序数组,要求找出数组中的第K大元素.比如给定的无序数组如下所示: 如果k=6,也就是要寻找第6大的元素,很显然,数组中第一大元素是24,第二 ...

  3. 单峰数组找最大元素C语言,查找单峰数组中的第k个元素

    给定一个n个不同元素的单峰数组A(意味着它的条目按递增顺序排列直到其最大元素,之后其元素的递减顺序),则整数p (即增加的第一部分的长度)和k(第k个最小元素)给出算法以计算在O(log n)时间中运 ...

  4. 【算法】数组与矩阵问题——找到无序数组中最小的k个数

    1 /** 2 * 找到无序数组中最小的k个数 时间复杂度O(Nlogk) 3 * 过程: 4 * 1.一直维护一个有k个数的大根堆,这个堆代表目前选出来的k个最小的数 5 * 在堆里的k个元素中堆顶 ...

  5. 小米笔试题:无序数组中最小的k个数

    题目描述 链接:https://www.nowcoder.com/questionTerminal/ec2575fb877d41c9a33d9bab2694ba47?source=relative 来 ...

  6. 找出无序数组中最小的k个数(top k问题)

    2019独角兽企业重金招聘Python工程师标准>>> 给定一个无序的整型数组arr,找到其中最小的k个数 该题是互联网面试中十分高频的一道题,如果用普通的排序算法,排序之后自然可以 ...

  7. python:无序数组中寻找第K大的元素

    题目: 所谓"第(前)k大数问题"指的是在长度为n(n>=k)的乱序数组中S找出从大到小顺序的第(前)k个数的问题. 解法1:堆排序 采用元素下沉法,维护一个k大小的最小堆, ...

  8. 算法设计--查找无序数组中第K大的数字

    给出一个数组,要求查找出这个数组中按顺序排第K大的数字. 思路:利用快速排序的思想,把数组中的元素分治,并计算中间值的位置,如果是K,则这个数就是第K大的数字,如果比K小,那么再次利用快速排序分治中值 ...

  9. 查找无序数组中第K大的数

    思路: 利用快速排序的划分思想 可以找出前k大数,然后不断划分 直到找到第K大元素 代码: #include <iostream> #include <algorithm> # ...

最新文章

  1. 防抖 节流_每日一题手写函数防抖与节流
  2. CMake结合Visual Studio中开发Qt应用程序注意事项
  3. Heartbeat,来点真的
  4. Python3系列__01Python安装
  5. Docker镜像的创建、存出、载入
  6. Unity 工具 之 常用插件分类汇总(UI/VR/AR/建模/Shader/动画/网络/AI/资源/数据/区块链等)
  7. ubuntu(乌班图)常用命令大全
  8. get请求中url传参中文乱码问题
  9. php url 转码,php url中文转码的方法
  10. 华为外包公司一面二面三面回顾
  11. 三消类游戏的核心算法
  12. 师董正伟:商务部受理微软涉垄断案
  13. 在华为云服务器安装libreoffice软件
  14. 新品发布 | P600准行业无人机研发平台,室外视觉识别跟踪、激光雷达避障、多机组网!
  15. 99.扩展.霍尔三维结构方法论 vs 切克兰德方法论
  16. format函数python生成列表_python 全栈开发,Day14(列表推导式,生成器表达式,内置函数)...
  17. 如何更新R以及RStudio
  18. 修改定位工具相关的app
  19. 利用python脚本自动发布服务之arcmap篇
  20. 轩辕剑-天之痕java_轩辕剑天之痕,芦家渡的宝藏当年有多少玩家得到过?

热门文章

  1. exchange 2010 集线器(hub)外发邮件的配置
  2. Web UI 制作规范
  3. 查询GC得到森林里主域和子域的帐号
  4. 苹果如果无法弹出⏏️
  5. 剑桥MPhil Industrial Systems, Manufacture and Management录取率
  6. 吹爆google colab
  7. 【转】Luajit-2.1.0-beta1的发布和生成arm64用bytecode的解脱
  8. mysql按某一字段分组取最大(小)值所在行的数据
  9. 第三次作业:阅读《构建之法》1-5章有感
  10. reactJS -- 9 组件的Refs(操作DOM的两种方法)