無序數組求第K大/第K小的數
阿新 • • 發佈:2018-11-08
std name 根據 ide ace mat algorithm cout ios
方法一: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> 6View Code#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 elsereturn 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小的數