线性求第k大
快排变种.
快排每次只进行部分排序,进入左边或者右边或者当前mid就是答案.
据说期望值是O(n)
然后STL中的 nth_element也是用这个思想.
#include <cstdio> // #include <windows.h> using namespace std; const int maxn = 1e6+5; int arr[maxn]; int n, k; int _sort(int l, int r) { int mid = (l + r) / 2; int ll = l, rr = r; int val; val = arr[mid]; arr[mid] = arr[l]; while (l < r) { while (arr[r] > val && l < r) r--; arr[l] = arr[r]; while (arr[l] <= val && l < r) l++; arr[r] = arr[l]; } arr[l] = val; if (l == k) return arr[l]; if (l - 1 > ll && ll<=k && k<=l-1) return _sort(ll, l-1); else if (rr > l + 1 && l+1<=k && k>=rr) return _sort(l+1, rr); else if (l-1 == k) return arr[l-1]; else if (l+1 == k) return arr[l+1]; else return -1; } int main() { //int n; scanf("%d%d", &n, &k); for (int i=0; i<n; ++i) scanf("%d", &arr[i]); k = n - k; printf("%d \n", _sort(0, n-1)); // for(int i=0; i<n; ++i) printf("%d ", arr[i]); // system("pause"); return 0; }