描述
数据很多,但我们经常只取前几名,比如奥运只取前3名。现在我们有n个数据,请按从大到小的顺序,输出前10个名数据。
输入
输入描述:
两行。
第一行一个整数n,表示要对多少个数据
第二行有n个整数,中间用空格分隔。表示n个数据。
输入样例:
26
54 27 87 16 63 40 40 22 61 6 57 70 0 42 11 50 13 5 56 7 8 86 56 91 68 59
输出
输出描述:
一行,按从大到小排列的前10个数据,每个数据之间用一个空格隔开。
输出样例:
91 87 86 70 68 63 61 59 57 56
这题我们可以是使用二分归并排序,即把数组一分为2一分再分,然后排序好再回溯组合回去,排序完成之后输出前10项即可,
当然也可以sort原函数直接排序再输出。
#include <iostream>
#include <cstring>
using namespace std;
int a[300],temp[300];
int Sort(int low,int high,int mid)
{
int j=low;
int k=mid+1;
int l=low;
while(j<=mid&&k<=high)
{
if(a[j]>a[k])
temp[l++]=a[j++];
else
temp[l++]=a[k++];
}
while(j<=mid)
temp[l++]=a[j++];
while(k<=high)
temp[l++]=a[k++];
for(int i=low; i<=high; i++)
{
a[i]=temp[i];
}
}
int mega(int low,int high)
{
if(low<high)
{
int mid=(low+high)/2;
mega(low,mid);
mega(mid+1,high);
Sort(low,high,mid);
}
}
int main()
{
int n;
while(cin>>n)
{
memset(a,0,sizeof(a));
for(int i=1;i<=n;i++)
cin>>a[i];
mega(1,n);
for(int i=1;i<10;i++)
cout<<a[i]<<" ";
cout<<a[10]<<endl;
}
return 0;
}