#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; }