#include <stdio.h>
void exch(int& a, int &b)
{
int tmp = a;
a = b;
b = tmp;
}
void fixup(int a[], int k)
{
while(k>1 && a[k/2]<a[k])
{
exch(a[k/2], a[k]);
k/=2;
}
}
void fixdown(int a[], int k, int N)
{
while(2*k <= N)
{
int j=k*2;
if(j<N && a[j]<a[j+1]) j++;
if(!(a[k]<a[j])) break;
exch(a[k], a[j]);
k = j;
}
}
class PQ
{
private:
int *pq;
int N;
public:
PQ(int maxN)
{
pq = new int[maxN+1];
N = 0;
}
int empty() const
{
return N == 0;
}
void insert(int item)
{
pq[++N] = item;
fixup(pq, N);
}
int getmax()
{
exch(pq[1], pq[N]);
fixdown(pq, 1, N-1);
return pq[N--];
}
};
#include <stdio.h>
#include "PQ.cpp"
using namespace std;
void pqsort(int a[], int l, int r)
{
int k;
PQ pq(r-l+1);
for(k=l; k<=r; k++)
pq.insert(a[k]);
for(k=r; k>=l; k--)
a[k] = pq.getmax();
}
int main()
{
int a[10] = {3,5,4,8,6,9,6,5,4,1};
pqsort(a, 0, 9);
for(int i=0; i<10; i++)
printf("%d ", a[i]);
printf("\n");
return 0;
}