Pagini recente » Cod sursa (job #936693) | Cod sursa (job #1200566) | Cod sursa (job #678464) | Monitorul de evaluare | Cod sursa (job #2079514)
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <queue>
#include <cstdlib>
#include <algorithm>
#include <iomanip>
#include <stack>
#if 1
#define pv(x) cout<<#x<<" = "<<x<<"; ";cout.flush()
#define pn cout<<endl
#else
#define pv(x)
#define pn
#endif
using namespace std;
ifstream in("algsort.in");
ofstream out("algsort.out");
#define ll long long
#define ull unsigned long long
#define pb push_back
#define mp make_pair
const int NMax = 1e6 + 5;
const ll inf = 1e18 + 5;
int N;
int v[NMax];
void sift(int,int);
int main() {
in>>N;
for (int i=1;i <= N;++i) {
in>>v[i];
}
for (int i=N/2;i > 0;--i) {
sift(i,N);
}
for (int i=N;i > 0;--i) {
swap(v[1],v[i]);
sift(1,i-1);
}
for (int i=1;i <= N;++i) {
out<<v[i]<<' ';
}
return 0;
}
void sift(int node,int lim) {
int son = 0;
do {
son = 0;
int fs = node<<1, ss = fs + 1;
if (fs <= lim) {
son = fs;
if (ss <= lim && v[ss] > v[fs]) {
son = ss;
}
}
if (son && v[son] > v[node]) {
swap(v[node],v[son]);
node = son;
}
else {
son = 0;
}
}
while (son != 0);
}