输出前m大个数,时间复杂度O(n+mlog(m)) [快排]

在这里插入图片描述

#include <iostream>
#include <string>
#include <math.h>
#include<algorithm>
using namespace std;
int a[10005];
int b[10005];
bool compare(int x, int y)
{
	return x > y;
}
void arrangeRight(int l, int r,int m)
{
	if (l >= r)
		return;
	int k = a[l];
	int low = l, high = r;
	while (low != high)
	{
		while (low < high && a[high] >= k)
			high--;
		swap(a[low], a[high]);
		while (low < high && a[low] <= k)
			low++;
		swap(a[low], a[high]);
	}
	if (r - low + 1 == m)
		return;
	else if (r - low + 1 > m)
		arrangeRight(low + 1, r, m);
	else
		arrangeRight(l, low - 1, m - (r - low + 1));
}
int main()
{
	int n, m;
	cin >> n >> m;
	for (int i = 0; i < n; i++)
	{
		cin >> a[i];
	}
	arrangeRight(0, n - 1, m);
	int count = 0;
	for (int i = n - m; i < n; i++) b[count++] = a[i];
	sort(b, b + m, compare);
	for (int i = 0; i < m; i++)
	{
		cout << b[i] << " ";
	}
}
posted @ 2020-08-24 10:55  _Hsiung  阅读(99)  评论(0编辑  收藏  举报