Pagini recente » Cod sursa (job #1336617) | Cod sursa (job #640818) | Cod sursa (job #2044076) | Cod sursa (job #601569) | Cod sursa (job #2073733)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("algsort.in");
ofstream fout("algsort.out");
const int Nmax = 5e5 + 10;
int n;
int Heap[Nmax];
int fiu_st(int nod)
{
return 2 * nod;
}
int fiu_dr(int nod)
{
return 2 * nod + 1;
}
void mk_heap(int Heap[], int n, int k)
{
int fiu;
do {
fiu = 0;
if(fiu_st(k) <= n) { // daca exista un nod mai mic decat tatal
fiu = fiu_st(k);
if(fiu_dr(k) <= n && Heap[fiu_dr(k)] > Heap[fiu_st(k)]) // iau fiul cel mai mare ca si valoare
fiu = fiu_dr(k);
if(Heap[fiu] <= Heap[k]) // daca valoarea celui mai mare fiu este mai mica decat a tatalui
fiu = 0; // atunci este bine si ma opresc
}
if(fiu) { // inseamna ca inca nu este un heap corect si interschimb fiul cu nodul curent adica tatal
swap(Heap[k], Heap[fiu]);
k = fiu;
}
}while(fiu);
}
void build_heap(int Heap[], int n)
{
for(int i = n / 2; i > 0; i--) // pentru fiecare nod care nu este frunza
mk_heap(Heap, n , i); // pun nodul i pe pozitia buna in heap
}
void HeapSort(int Heap[], int n)
{
build_heap(Heap, n);
for(int i = n; i >= 2; i--) { // incepand cu ultima pozitie din heap, gasesc maximul si il pun pe pozitia i
swap(Heap[i], Heap[1]);
mk_heap(Heap, i - 1, 1); // urmand sa caut maximul din secventa de i - 1 noduri
}
}
int main()
{
fin >> n;
for(int i = 1; i <= n; ++i) {
fin >> Heap[i];
}
HeapSort(Heap, n);
for(int i = 1; i <= n; ++i) fout << Heap[i] << " ";
return 0;
}