172210704111-陈国佳总结《2017年12月22日》【连续072天】
标题:输出前k大的数的尝试;
内容:
描述
给定一个数组,统计前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
(具体思路见063day)
#include<iostream>
#include<cmath>
using namespace std;
int swap(int &a,int &b)
{
int tmp=a;
a=b;
b=tmp;
}
void arrangeRight(int a[],int s,int e,int k)
{
if(s>=e)return;
int t=a[s],i=s,j=e;
while(i!=j){
if(i<j&&a[j]>=t)j--;
swap(a[i],a[j]);
if(i<j&&a[i]<=t)++i;
swap(a[i],a[j]);
}
if(k==e-i+1)return;
else if(k<e-i+1)arrangeRight(a,i,e,k);
else arrangeRight(a,s,i-1,k-e+i-1);
}
void QuickSort(int a[],int s,int e)
{
if(s>=e)return;
int k=a[s];
int i=s,j=e;
while(i!=j){
if(i<j&&a[j]<=k)j--;
swap(a[i],a[j]);
if(i<j&&a[i]>=k)++i;
swap(a[i],a[j]);
}
QuickSort(a,s,i);
QuickSort(a,i+1,e);
}
int main()
{
int n,k;
cin>>n;
int a[n];
for(int i=0;i<n;++i)
cin>>a[i];
cin>>k;
int size=sizeof(a)/sizeof(int);
arrangeRight(a,0,size-1,k);
QuickSort(a,size-1-k,size-1);
for(int i=size-k;i<=size-1;i++)
cout<<a[i]<<endl;
return 0;
}
还需要进一步优化,争取明天解决这道题;
明日计划:学习;