Pagini recente » Cod sursa (job #1122848) | Cod sursa (job #1040773) | Cod sursa (job #539954) | Cod sursa (job #2456637) | Cod sursa (job #1236167)
#include <cstdio>
#include <algorithm>
using namespace std;
int n,i,a[500001],nn;
void CombHeap(int poz,int n)
{
if (2*poz>n)return ;
if (2*poz<=n)
{
if (2*poz+1<=n)
{
if (a[2*poz+1]>a[2*poz])
{
if (a[2*poz+1]>a[poz])
{
swap(a[2*poz+1],a[poz]);
CombHeap(2*poz+1,n);
}
}
else
{
if (a[2*poz]>a[poz])
{
swap(a[2*poz],a[poz]);
CombHeap(2*poz,n);
}
}
}
else
{
if (a[2*poz]>a[poz])
{
swap(a[2*poz],a[poz]);
CombHeap(2*poz,n);
}
}
}
}
void heapdown(int n,int r)
{
int st,dr;
if (2*r<=n)
{
st=a[2*r];
if (2*r+1<=n)dr=a[2*r+1];
else dr=-1;
if (st>dr)
{
if (a[2*r]>a[r])
{
swap(a[2*r],a[r]);
heapdown(n,2*r);
}
}
else
{
if (a[2*r+1]>a[r])
{
swap(a[2*r+1],a[r]);
heapdown(n,2*r+1);
}
}
}
}
int main()
{
freopen("algsort.in","r",stdin);
freopen("algsort.out","w",stdout);
scanf("%d ",&n);
for (i=1; i<=n; i++)
scanf("%d ",&a[i]);
for (i=n/2; i>=1; i--)
{
CombHeap(i,n);
}
nn=n;
while (nn>0)
{
swap(a[1],a[nn]);
nn--;
heapdown(nn,1);
}
for (i=1; i<=n; i++)
printf("%d ",a[i]);
return 0;
}