Pagini recente » Cod sursa (job #1476515) | Cod sursa (job #2431219) | Cod sursa (job #2635604) | Cod sursa (job #2573000) | Cod sursa (job #371554)
Cod sursa(job #371554)
#include<fstream>
using namespace std;
long H[500000];
const long MAX_HEAP_SIZE = 16384;
typedef long Heap[MAX_HEAP_SIZE];
inline long father(long nod) {
return nod / 2;
}
inline long left_son(long nod) {
return nod * 2;
}
inline long right_son(long nod) {
return nod * 2 + 1;
}
void sift(Heap H, long N, long K) {
long 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 longerschimba H[K] cu H[son].
K = son;
}
} while (son);
}
void build_heap(Heap H, long N) {
for (long i = N / 2; i > 0; --i) {
sift(H, N, i);
}
}
void heapsort(Heap H, long N) {
build_heap(H, N);
// Sorteaza vectorul.
for (long i = N; i >= 2; --i) {
swap(H[1], H[i]);
sift(H, i - 1, 1);
}
}
int main()
{
long i,n;
ifstream f("algsort.in");
ofstream g("algsort.out");
f>>n;
for(i=1;i<=n;i++)f>>H[i];
heapsort(H,n);
for(i=1;i<=n;i++)g<<H[i]<<' ';
return 0;
}