直接使用堆处理
#include <stdio.h>
#include <malloc.h>
#include <limits.h>
typedef struct HeapNode* Heap;
struct HeapNode{
int size;
int capacity;
int* arr;
};
Heap InitHeap(int N)
{
Heap H=(Heap)malloc(sizeof(struct HeapNode));
H->size=0;
H->capacity=N+1;
H->arr=(int*)malloc(sizeof(int)*(N+1));
H->arr[0]=INT_MAX;
return H;
}
void InsertHeap(int num,Heap H)
{
int i=++H->size;
for(;num>H->arr[i/2];i/=2)
{
H->arr[i]=H->arr[i/2];
}
H->arr[i]=num;
}
int OutMax(Heap H)
{
int Max=H->arr[1];
int Last=H->arr[H->size--];
int parent,child;
for(parent=1;parent*2<=H->size;parent=child)
{
child=parent*2;
if(child!=H->size&&H->arr[child]<H->arr[child+1])
{
child++;
}
if(H->arr[child]<Last)
{
break;
}else
{
H->arr[parent]=H->arr[child];
}
}
H->arr[parent]=Last;
return Max;
}
int main()
{
int N,M,number;
scanf("%d %d",&N,&M);
Heap H=InitHeap(N);
for(int i=0;i<N;i++)
{
scanf("%d",&number);
InsertHeap(number,H);
}
for(int i=0;i<M;i++)
{
if(i==N)
{
break;
}
if(i)
{
printf(" %d",OutMax(H));
}else
{
printf("%d",OutMax(H));
}
}
return 0;
}