方法一: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大的数。

 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并不能使两个数交换,以后我一定自己写。(鞠躬表示歉意)

搞了半天搞错了,还是挖坑吧。

 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小的数相关推荐

  1. 无序数组求第k大的数 python_整数无序数组求第K大数

    import java.util.Scanner; /** * 类似与求第k小的问题 * 求第k大相当于求第n-k+1小,n为数组长度 * * 著名的BFPRT算法可保证在线性时间内得到结果. * h ...

  2. 无序数组求第k大的数 python_【python刷题】寻找数组中第K大/小的数

    使用堆 import heapq def findKthLargest(nums, k): stack = [] for num in nums: heapq.heappush(stack, num) ...

  3. 整数无序数组求第K大数(暴力|快排) - 滴滴出行2018校园招聘内推笔试-研发工程师

    时间限制:1S 空间限制:32768K 题目描述: 给定无序整数序列,求第K大的数,例如{45,67,33,21},第2大的数为45 输入描述: 输入第一行为整数序列,数字用空格分割,如:45 67 ...

  4. 整数无序数组求第k大数

    题目来自牛客网 https://www.nowcoder.com/practice/097ab63cffa847d89716f2ca8c23524f?tpId=90&tqId=30914&am ...

  5. 第K大/Top K及其简单实现

    转载请注明出处:http://blog.csdn.net/u012469987/. 见网上第K大多数只给思路,没给实现,我就来填坑了. update 2017-09-23 有同学反馈说面试遇到这个题, ...

  6. 合并两个无序数组java_Java实现十大排序算法(上)

    概念 概念解释稳定如果a原本在b前面,而a=b,排序之后a仍然在b的前面.不稳定如果a原本在b的前面,而a=b,排序之后 a 可能会出现在 b 的后面.时间复杂度对排序数据的总的操作次数,反映当n变化 ...

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

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

  8. 面试官:海量无序数据,寻找第 K 大的数,越快越好

    最近在参加阿里云举办的<第三届数据库大赛创新上云性能挑战赛--高性能分析型查询引擎赛道>,传送门: https://tianchi.aliyun.com/competition/entra ...

  9. 海量无序数据寻找第 K 大的数

    前言 最近在参加阿里云举办的<第三届数据库大赛创新上云性能挑战赛--高性能分析型查询引擎赛道>,传送门:https://tianchi.aliyun.com/competition/ent ...

最新文章

  1. AI 2000上榜学者秦兵:走进计算机的情感世界
  2. NTP时间同步服务器报错:no server suitable for synchronization found
  3. python中二维数组的建立,输入和输出
  4. Python内存管理方式和垃圾回收算法解析
  5. 从 wiscKey 看 LSMtree 的不足
  6. json api_JSON模式在构建和部署API中的作用
  7. 前端学习(3010):vue+element今日头条管理--回顾
  8. python判断密码强度并输出_密码强度判断
  9. Visual studio 内存不足的解决方案(out of memory)
  10. linux symbol文件,[转] Linux文件系统之hard linksymbol link
  11. 如何理解JavaScript用三角函数计算鼠标与多个目标点的距离
  12. 【小程序项目分享】多功能抽签分组系统
  13. 随机森林算法原理解析
  14. 利用python编程,制作自己的游戏“外挂”!
  15. 海淀牙齿矫正:牙齿矫正的步骤
  16. 微信支付 django
  17. linux中的man命令总结
  18. win10 OCX控件的注册
  19. 白光干涉仪可以用于测量化妆品用的云母材料?
  20. HTML5 weui笔记

热门文章

  1. (二)为AI模型训练准备影像
  2. RequireJS简单教程
  3. SQL的TRUNCATE和DELETE
  4. Ubuntu 19.10 停止支持 32 位的 x86 架构
  5. LINQ to CSV,一种类型安全,动态的高性能方法
  6. 简述python_简述Python语言经验总结
  7. matlab里vpa怎么用_“学校里的师兄师姐,用英文怎么说?”
  8. htt:// ************不在以下 request 合法域名列表中,请参考文档:******************************
  9. 复习vue笔记第一天
  10. html触摸电脑ui系统,如何用高级UI制作触摸系统界面