Pagini recente » Cod sursa (job #6426) | Cod sursa (job #2387075) | Cod sursa (job #2729428) | Cod sursa (job #3133186) | Cod sursa (job #854487)
Cod sursa(job #854487)
#include <cstdio>
#define nmax 1048576
using namespace std;
int n, H[nmax];
void input()
{
freopen("algsort.in", "r", stdin);
scanf("%d", &n);
for (int i=1; i<=n; ++i)
scanf("%d", &H[i]);
}
int leftSon(int k)
{
return 2*k;
}
int rightSon(int k)
{
return 2*k + 1;
}
void swap(int &a, int &b)
{
a ^= b;
b ^= a;
a ^= b;
}
void sift(int n, int k)
{
int son;
do
{
son = 0;
if (leftSon(k) <= n)
{
son = leftSon(k);
if (rightSon(k) <= n)
if (H[leftSon(k)] < H[rightSon(k)])
son = rightSon(k);
if (H[son] <= H[k])
son = 0;
}
if (son)
{
swap(H[k], H[son]);
k = son;
}
}
while (son);
}
void buildHeap()
{
for (int i=n>>1; i>0; --i)
sift(n, i);
}
void heapSort()
{
buildHeap();
for (int i=n; i>1; --i)
{
swap(H[1], H[i]);
sift(i-1, 1);
}
}
void output()
{
freopen("algsort.out", "w", stdout);
for (int i=1; i<=n; ++i)
printf("%d ", H[i]);
}
int main()
{
input();
heapSort();
output();
return 0;
}