快速排序(分治)

1:输出前k大的数

总时间限制: 
10000ms 
单个测试点时间限制: 
1000ms 
内存限制: 
65536kB
描述

给定一个数组,统计前k大的数并且把这k个数从大到小输出。

输入
第一行包含一个整数n,表示数组的大小。n < 100000。
第二行包含n个整数,表示数组的元素,整数之间以一个空格分开。每个整数的绝对值不超过100000000。
第三行包含一个整数k。k < n。
输出
从大到小输出前k大的数,每个数一行。
样例输入
10
4 5 6 9 8 7 1 2 3 0
5
样例输出
9
8
7
6
5






源代码

#include<stdio.h>
#include<algorithm>

using namespace std;

void swap(int & a, int & b)
{
	int tmp = a;
	a = b;
	b = tmp;
}

void QuickSort(int a[], int s ,int e)
{
	if(s>=e)
	return ;
	int k=a[s];
	int i=s , j=e;
	while(i!=j)
	{
		while(i < j && a[j] >= k )
		j--;
		swap(a[i] , a[j]);	
		while(i < j && a[i] <= k)
		i++;
		swap(a[i] , a[j]);	
	}
	QuickSort(a , s , i-1);
	QuickSort(a , i+1 , e); 
}

int main()
{
	int a[100005];
	int n;
	scanf("%d",&n);
	for(int i=0; i<n; i++)
	{
		scanf("%d",&a[i]);
	}
	QuickSort(a, 0, n-1);
	int m;
	scanf("%d",&m);
	for(int j=n-1 ; j>n-m-1 ; j--)
	printf("%d\n",a[j]);
	
	return 0;
 } 













posted @ 2017-08-13 16:28  Veritas_des_Liberty  阅读(316)  评论(0编辑  收藏  举报