快速排序来找第k大值可以达到线性的复杂度, 虽然这里给的代码是输出第k大数在原始数组中的下标, 但核心的做法都是一样的
#include<iostream>
using namespace std;
int n, k;
struct node
{
int p;
int date;
}num[10000];
int quicksort(int l, int r)
{
if(l <= r)
{
int i = l, j = r, temp = num[l].date;
while(i != j)
{
while(num[j].date >= temp && i < j) j--;
while(num[i].date <= temp && i < j) i++;
if(i < j) swap(num[i], num[j]);
}
swap(num[l], num[i]);
if(i == n - k) return num[i].p;
else if(i < n - k) return quicksort(i +1, r);
else return quicksort(l, i - 1);
}
}
int main()
{
cin >> n >> k;
for(int i = 0; i < n; i++)
{
cin >> num[i].date;
num[i].p = i;
}
cout << quicksort(0, n -1);
}