无序数组求第K大/第K小的数

Posted kaike

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无序数组求第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大的数。

技术分享图片
 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

 

方法二:最小堆

 

以上是关于无序数组求第K大/第K小的数的主要内容,如果未能解决你的问题,请参考以下文章

基于快速排序方法改成求第k大的数

【python滴滴出行】整数无序数组求第K大数?

经典面试题无序数组中,求第K大的数(堆荷兰国旗问题bfprt算法)

经典面试题无序数组中,求第K大的数(堆荷兰国旗问题bfprt算法)

经典面试题无序数组中,求第K大的数(堆荷兰国旗问题bfprt算法)

快排划分思想的应用-求第k大数或者第k小的数(求前k大数或者前k小的数)