直接使用快速排序然后选择数字输出,时间复杂度为nlogn
比较第一大的数字,排除,再比较第2大的数字,,,,直到选出那个数字,时间复杂度为(n-1)+(n-2)+...+(n-k)次
快速排序改算法
#include <iostream>
using namespace std;
int n,k;
const int N = 100000;
int q[N];
int quicksort(int l, int r, int k)
{
if (l >= r)
return q[l];
int i = l - 1, j = r + 1;
int x = q[(l + r) / 2];
while (i < j)
{
do(++i);while (q[i] < x);
do(--j);while (q[j] > x);
if (i < j)
swap(q[i], q[j]);
}
int sl = j - l + 1;
if (k <= sl)
return quicksort(l, j, k);
else
return quicksort(j + 1, r, k-sl);
}
int main()
{
cin >> n >> k;
for (int i = 0; i < n; i++)
{
cin >> q[i];
}
cout << quicksort(0, n - 1, k) << endl;
return 0;
}
毕竟是模板题目
记住最好
易错:
这里是k-sl,因为比较的是递归串的长度而不是字符的下标
这里是传l而不是0;因为递归可能第一次是前半段,第二次就变成后半段了,容易误解