Pagini recente » Cod sursa (job #444385) | Cod sursa (job #2190352) | Cod sursa (job #2449935) | Cod sursa (job #2187184) | Cod sursa (job #1982401)
#include <iostream>
#include <fstream>
#include <math.h>
#include <algorithm>
#include <cstdlib>
#include <time.h>
using namespace std;
ifstream in("algsort.in");
ofstream out("algsort.out");
#define ll long long
#define pb push_back
const int NMax = 5e5 + 5;
// sortare cu algoritmul heapsort
int N;
int v[NMax];
void buildHeap();
// buildHeap() transforma vectorul v intr-un heap
// (fiecare nod i este mai mare ca nodurile de pe pozitiile 2*i si 2*i + 1)
void sift(int);
// sift(i) muta nodul i in jos in heap pana cand acesta se afla in pozitia corespunzatoare
int main() {
in>>N;
for (int i=1;i <= N;++i) {
in>>v[i];
}
buildHeap();
int temp = N;
// la fiecare iteratie, maximul este pus in coada vectorului
// si se face un sift pe elementele ramase pentru a determina noul maxim
while (N) {
swap(v[1],v[N--]);
sift(1);
}
for (int i=1;i <= temp;++i) {
out<<v[i]<<' ';
}
out<<'\n';
in.close();out.close();
return 0;
}
void buildHeap() {
// se face sift pentru fiecare nod i, stiind ca subarborele sau are o structura de heap corecta
// nodurile de la N/2 + 1 pana la N nu au fii in heap, deci sunt frunze.
// Astfel, subarborele lor contine un singur nod care are o structura de heap corecta
for (int i=N/2;i > 0;--i) {
sift(i);
}
}
void sift(int node) {
int son = 0;
do {
son = 0;
int fs = 2*node,
ss = fs + 1;
if (fs <= N) {
son = fs;
if (ss <= N && v[ss] > v[son]) {
son = ss;
}
}
if (son && v[son] > v[node]) {
swap(v[son],v[node]);
node = son;
}
else {
son = 0;
}
}
while (son);
}