快排:
找left right,然后随机出一个idx放在left中
然后遍历ij双指针,找到不符合的并交换
最后把left和i交换
最后判断i的位置是否满足
输出后k个即可
//
// Created by 009 on 2022/3/6.
//
#include<bits/stdc++.h>
using namespace std;
int findKthLargest(vector<int>& nums, int k) {
int n=nums.size();
// 初始化
int le=0, ri=n-1;
while(true){
//快排框架
int i=le, j=ri;
int idx = rand() % (ri - le +1) + le;//随机选择pivot
// 把pivot放在最前
swap(nums[le], nums[idx]);
while(i<j){
//找到不合规的j
while(i<j&&nums[j]>=nums[le]) --j;
//找到不合规的i
while(i<j&&nums[i]<=nums[le]) ++i;
swap(nums[i], nums[j]);
}
// 恢复原位
swap(nums[i], nums[le]);//nums[le]应处的位置在索引i处
if(i==n-k) return i;//若恰为倒数第K的位置, 直接返回位置
else if(i>n-k) ri=i-1;//将查找范围放在该位置左侧
else le=i+1;//将查找范围放在该位置右侧
}
}
int main() {
//找出vector中第k大的数
vector<int> v = {1, 3, 5, 9, 9, 7, 5, 6, 7};
int k = 7;
int myKL = findKthLargest(v, k);
//找出前k个大的数
vector<int> ans;
for(int i = myKL; i < v.size(); i++) {
ans.push_back(v[i]);
}
sort(ans.rbegin(), ans.rend());
for(int i = 0; i < k; i++) {
if(i == 0) cout << ans[i];
else cout << " " << ans[i];
}
}