题目描述如上。
思路:把前k大的都弄到数组最右边,然后对这最右边k个元素排序,再输出
关键 :O(n)时间内实现把前k大的都弄到数组最右边
此处的PPT来源:
如果不小心冒犯了老师的版权,请通知我一下,我里面删除内容。。。
最后贴一下代码:
#include <iostream>
#include <algorithm>
#include <functional>
using namespace std;
void findKth(int a[], int s, int e, int k);
void swap(int &a, int &b);
const int maxn = 100005;
int a[maxn];
int main() {
int n;
cin >> n;
for(int i = 0; i < n; i++) {
cin >> a[i];
}
int k;
cin >> k;
findKth(a, 0, n - 1, k);
sort(a + n - k, a + n);
for(int i = n - 1; i >= n - k; i--) {
cout << a[i] << endl;
}
return 0;
}
void findKth(int a[], int s, int e, int k) {
if(s >= e) {
return;
}
int t = a[s];
int i = s;
int j = e;
while(i != j) {
if(i < j && a[j] >= t) {
j--;
}
swap(a[i], a[j]);
if(i < j && a[i] <= t) {
i++;
}
swap(a[i], a[j]);
}
int right = e + 1 - i;
if(right == k) {
return;
} else if(right > k) {
findKth(a, i + 1, e, k);
} else {
findKth(a, s, i - 1, k - right);
}
}
void swap(int &a, int &b) {
int temp = a;
a = b;
b = temp;
}