#include <iostream>
using namespace std;
void swap(int &a,int &b)
{
int temp=a;
a=b;
b=temp;
}
// 大根堆
void heapify(int *ary,int i,int size)
{
int l,r,max;
while(i<size)
{
l=2*i+1;
r=l+1;
max=i;
if(l<size&&ary[i]<ary[l])
i=l;
if(r<size&&ary[i]<ary[r])
i=r;
if(max!=i)
swap(ary[i],ary[max]);
else
break;
}
}
void buildheap(int *ary,int size)
{
for(int i=(size-2)/2;i>=0;i--)
heapify(ary,i,size);
}
void func()
{
int n,m;
while(cin>>n>>m)
{
int ary[n];
if(n==0&&m==0)break;
for(int i=0;i<n;i++)
{
cin>>ary[i];
}
buildheap(ary,n);
int j;
for(j=0;j<m-1;j++)
{
if(j<n-1){
swap(ary[0],ary[n-1-j]);
cout<<ary[n-1-j]<<" ";
heapify(ary,0,n-1-j);
}
}
swap(ary[0],ary[n-1-j]);
cout<<ary[n-1-j]<<endl;
}
}
int partition(int *ary,int l,int r)
{
int m=((r-l)>>1)+l;
swap(ary[l],ary[m]);
int i=l,j=r;
int key=ary[l];
while(i<j){
while(i<j&&ary[j]>=key)j--;
ary[i]=ary[j];
while(i<j&&ary[i]<=key)i++;
ary[j]=ary[i];
}
ary[i]=key;
return i;
}
void quicksort(int *ary,int l,int r)
{
if(l<r){
int m=partition(ary,l,r);
quicksort(ary,l,m-1);
quicksort(ary,m+1,r);
}
}
void func1()
{
int n,m;
while(cin>>n>>m)
{
int ary[n];
if(n==0&&m==0)break;
for(int i=0;i<n;i++)
cin>>ary[i];
quicksort(ary,0,n-1);
int j=0;
for(;j<m-1;j++)
{
if(j<n-1){
cout<<ary[n-1-j]<<" ";
}
}
cout<<ary[n-1-j]<<endl;
}
}
int main(int argc, char *argv[])
{
//printf("Hello, world\n");
//func();
func1();
return 0;
}
快速排序或堆排序或其他排序,比如计数排序
-
题目描述:
-
浙江桐乡乌镇共有n个人,请找出该镇上的前m个大富翁.
-
输入:
-
输入包含多组测试用例.
每个用例首先包含2个整数n(0<n<=100000)和m(0<m<=10),其中: n为镇上的人数,m为需要找出的大富翁数, 接下来一行输入镇上n个人的财富值.
n和m同时为0时表示输入结束.
-
输出:
-
请输出乌镇前m个大富翁的财产数,财产多的排前面,如果大富翁不足m个,则全部输出,每组输出占一行.
-
样例输入:
-
3 1 2 5 -1 5 3 1 2 3 4 5 0 0
-
样例输出:
-
5 5 4 3