1. 程式人生 > >無序數組求第K大/第K小的數

無序數組求第K大/第K小的數

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>
 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小的數