无序数组求第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 }
方法二:最小堆
以上是关于无序数组求第K大/第K小的数的主要内容,如果未能解决你的问题,请参考以下文章
经典面试题无序数组中,求第K大的数(堆荷兰国旗问题bfprt算法)
经典面试题无序数组中,求第K大的数(堆荷兰国旗问题bfprt算法)