给你n个整数,请按从大到小的顺序输出其中前m大的数。
Input
每组测试数据有两行,第一行有两个数n,m(0<n,m<1000000),第二行包含n个各不相同,且都处于区间[-500000,500000]的整数。
Output
对每组测试数据按从大到小的顺序输出前m大的数。
Sample Input
5 3
3 -35 92 213 -644
Sample Output
213 92 3
Hint
请用VC/VC++提交 // 不能用选择排序Time Limit Exceeded,最后用了希尔排序
#include<stdio.h>
int n, m, a[]; void Sort(int a[], int len)
{
int i, j, k, gap, temp;
for(gap=len/; gap>; gap/=)
{
for(i=gap; i<len; i++)
{
temp=a[i];
for(j=i-gap; j>=&&temp>a[j]; j-=gap)
{
a[j+gap]=a[j];
}
a[j+gap]=temp;
}
}
} int main()
{
int i;
while(scanf("%d %d", &n, &m)!=EOF)
{
for(i=;i<n;i++)
scanf("%d", &a[i]);
Sort(a, n);
for(i=;i<m;i++)
{
if(i==m-) printf("%d\n", a[i]);
else printf("%d ", a[i]);
}
}
return ;
}
AC
// 关于希尔排序的理解参考:
https://blog.****.net/weixin_37818081/article/details/79202115
https://www.cnblogs.com/daohuoren/p/6614766.html// 附上代码
// 默认从小到大排序
void selc_sort(int a[], int len);
void shell_sort(int a[], int len); void selc_sort(int a[], int len)
{
int i, j, t, min;
for(i=;i<len-;i++)
{
min=i;
for(j=i+;j<len;j++)
if(a[min]>a[j]) min=j;
if(min!=i)
{ t=a[i]; a[i]=a[min]; a[min]=t; }
}
} void shell_sort(int a[], int len)
{
int i, j, gap, t;
for(gap=len/; gap>; gap/=)
for(i=gap; i<len; i++)
for(j=i;j-gap>=&&a[j]<a[j-gap];j-=gap)
{ t=a[j-gap]; a[j-gap]=a[j]; a[j]=t; }
}
sort.h