排序,快排
本题要点:
1、利用快排,可以在 O(n) 的时间内,找出第k大的数。
2、再用 sort 对 前 m 个数进行排序
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int MaxN = 1000010;
int a[MaxN];
int n, m;
bool cmp(int a, int b)
{
return a > b;
}
int partition(int left, int right)
{
int i = left;
int tmp = a[right];
for(int j = left; j < right; ++j)
{
if(a[j] > tmp)
{
swap(a[j], a[i]);
++i;
}
}
swap(a[i], a[right]);
return i;
}
void quick_sort()
{
int l = 0, r = n - 1, mid;
mid = partition(l, r);
while(mid != m - 1)
{
if(mid < m - 1)
{
l = mid + 1;
}else{
r = mid - 1;
}
mid = partition(l, r);
}
sort(a, a + m, cmp);
printf("%d", a[0]);
for(int i = 1; i < m; ++i)
{
printf(" %d", a[i]);
}
printf("\n");
}
int main()
{
while(scanf("%d%d", &n, &m) != EOF)
{
for(int i = 0; i < n; ++i)
{
scanf("%d", &a[i]);
}
quick_sort();
}
return 0;
}
/*
5 3
3 -35 92 213 -644
*/
/*
213 92 3
*/