Pagini recente » Istoria paginii utilizator/eugen_cutic | Cod sursa (job #1826940) | Cod sursa (job #2843550) | Cod sursa (job #2670564) | Cod sursa (job #883090)
Cod sursa(job #883090)
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("algsort.in");
ofstream fout("algsort.out");
const int MAX_HEAP_SIZE = 500000;
typedef int Heap[MAX_HEAP_SIZE];
long n;
Heap v;
inline int father(int nod) {
return nod / 2;
}
inline int left_son(int nod) {
return nod * 2;
}
inline int right_son(int nod) {
return nod * 2 + 1;
}
inline int max(Heap H) {
return H[1];
}
void sift(Heap H, int N, int K) {
int son;
do {
son = 0;
// Alege un fiu mai mare ca tatal.
if (left_son(K) <= N) {
son = left_son(K);
if (right_son(K) <= N && H[right_son(K)] > H[left_son(K)]) {
son = right_son(K);
}
if (H[son] <= H[K]) {
son = 0;
}
}
if (son) {
swap(H[K], H[son]); // Functie STL ce interschimba H[K] cu H[son].
K = son;
}
} while (son);
}
void build_heap(Heap H, int N) {
for (int i = N / 2; i > 0; --i) {
sift(H, N, i);
}
}
void heapsort(Heap H, int N) {
build_heap(H, N);
// Sorteaza vectorul.
for (int i = N; i >= 2; --i) {
swap(H[1], H[i]);
sift(H, i - 1, 1);
}
}
int main()
{
fin >> n;
for(long i=1; i<=n; i++){
fin >> v[i];
}
heapsort(v, n);
for(long i=1; i<=n; i++)
fout << v[i] << " ";
return 0;
}