对应HDU 题目:点击打开链接
| Time Limit: 1000MS | Memory Limit: 32768KB | 64bit IO Format: %I64d & %I64u |
Description
Input
Output
Sample Input
5 3 3 -35 92 213 -644
Sample Output
213 92 3
Hint
Hint 请用VC/VC++提交
sort, 归并,快排都能过~快排快点
快排就是,先找序列中的一个数为基数,比如第一个数a[0],使x=a[0]。之后定义i=0, j=n-1(假设数组是0~n-1)。先从后面往前找(即j--)第一个比x小的数a[j],使a[i]=a[j],再从前面往后找(即i++)第一个比x大的数,使a[j]=a[i];再从后面往前找....不断重复,最后当i==j时,使a[i]=x;结束退出。这样做实际是把比x小的都放到x前面,比x大的都放到x后面的一个过程。之后递归操作注意下边界就可以了,如果不熟悉递归,建议画下解答数模拟过程。。。
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<map>
#include<queue>
#include<stack>
#include<vector>
#include<algorithm>
#include<cstring>
#include<string>
#include<iostream>
const int MAXN=1000000+10;
using namespace std;
int a[MAXN];
void q_sort(int *A, int l, int r)
{
if(!(l<r)) return;
int i=l,j=r;
int basic=A[l];
while(i<j)
{
while(1)
{
if(j==i) break;
if(A[j]<basic){
A[i]=A[j]; break;
}
j--;
}
while(1)
{
if(j==i) break;
if(A[i]>basic){
A[j]=A[i]; break;
}
i++;
}
}
A[i]=basic;
q_sort(A,l,i-1);
q_sort(A,i+1,r);
}
int main()
{
//freopen("in.txt","r",stdin);
int n,k;
while(scanf("%d%d", &n,&k)==2)
{
for(int i=0; i<n; i++) scanf("%d", &a[i]);
q_sort(a, 0, n-1);
//for(int i=0; i<n; i++) cout<<a[i]<<" ";
//cout<<endl;
printf("%d", a[n-1]);
for(int i=n-2; i>=n-k; i--)
printf(" %d", a[i]);
printf("\n");
}
return 0;
}
原文:http://blog.csdn.net/u013351484/article/details/38842803