Pagini recente » Cod sursa (job #1388924) | Cod sursa (job #1051817) | Cod sursa (job #2278206) | Cod sursa (job #2665953) | Cod sursa (job #1337931)
#include <cstdio>
#include <algorithm>
using namespace std;
#define MAX_HEAP 500005
#define inFile "algsort.in"
#define outFile "algsort.out"
class Heap {
private:
int heap[MAX_HEAP];
int n;
inline int left_son(int k) { return k*2; };
inline int right_son(int k) { return k*2+1; };
inline int father(int k) { return k/2; };
void down(int k);
void up(int k);
public:
Heap(const int *a, int n);
void h_insert(int key);
void h_remove(int k);
int top();
bool h_empty();
};
void Heap::down(int k) {
int son;
do {
son = 0;
if(left_son(k) <= n) {
son = left_son(k);
if(right_son(k) <= n && heap[right_son(k)] < heap[son])
son = right_son(k);
if(heap[son] >= heap[k])
son = 0;
}
if(son) {
swap(heap[k], heap[son]);
k = son;
}
} while(son);
}
void Heap::up(int k) {
int key = heap[k];
while(k > 1 && heap[k] < heap[father(k)]) {
heap[k] = heap[father(k)];
k = father(k);
}
heap[k] = key;
}
Heap::Heap(const int *a, int len) {
int i;
n = len;
for(i = 1; i <= n; i++)
heap[i] = *(a+i);
for(i = n/2; i; --i)
down(i);
}
void Heap::h_remove(int k) {
heap[k] = heap[n];
--n;
if(k > 1 && heap[k] < heap[father(k)])
up(k);
else
down(k);
}
void Heap::h_insert(int key) {
heap[++n] = key;
up(n);
}
int Heap::top() {
return heap[1];
}
bool Heap::h_empty() {
return n == 0;
}
int a[MAX_HEAP];
int main() {
freopen(inFile, "r", stdin);
freopen(outFile, "w", stdout);
int n, i;
scanf("%d", &n);
for(i = 1; i <= n; i++)
scanf("%d", &a[i]);
Heap H(a, n);
while(!H.h_empty()) {
printf("%d ", H.top());
H.h_remove(1);
}
printf("\n");
return 0;
}