Pagini recente » Borderou de evaluare (job #2985215) | Borderou de evaluare (job #2057327) | Cod sursa (job #2501353) | Borderou de evaluare (job #692015) | Cod sursa (job #1988468)
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <vector>
#include <cstring>
using namespace std;
ifstream in("algsort.in");
ofstream out("algsort.out");
#define ll long long
#define pb push_back
const int NMax = 2e6 + 5;
const ll inf = 1e9 + 5;
int N;
int v[NMax];
void heapSort();
void buildHeap();
void sift(int,int);
int main() {
in>>N;
for (int i=1;i <= N;++i) {
in>>v[i];
}
heapSort();
for (int i=1;i <= N;++i) {
out<<v[i]<<' ';
}
out<<'\n';
in.close();out.close();
return 0;
}
void heapSort() {
buildHeap();
for (int i = N;i > 1;) {
swap(v[1],v[i]);
--i;
sift(1,i);
}
}
void buildHeap() {
for (int i=N/2;i > 0; --i) {
sift(i,N);
}
/*
for (int i = 1;i <= N;++i) {
cout<<v[i]<<' ';
}
*/
}
void sift(int node,int lim) {
int son;
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[son],v[node]);
node = son;
}
else {
son = 0;
}
}
while (son);
}