Pagini recente » Cod sursa (job #2703735) | Cod sursa (job #3183015) | Cod sursa (job #1227611) | Cod sursa (job #47703) | Cod sursa (job #1450424)
#include <cstdio>
using namespace std;
int heap[500001];
void schimbare(int &a,int &b)
{
int c=a;
a=b;
b=c;
}
void down_sift(int heap1[],int n,int k)
{
int ok=1;
while (ok)
{
int min=heap1[k],min1=k,i=k;
if (i*2 <= n && heap1[i*2] > heap1[i])
{
min=heap1[i*2];
min1=i*2;
}
if (i*2 + 1<=n && heap1[i*2+1] > heap1[i*2] && heap1[i*2 + 1] > heap1[i])
{
min=heap1[i*2+1];
min1=i*2+1;
}
if (i*2 > n || min ==heap1[k])
ok=0;
else
{
schimbare(heap1[k],heap1[min1]);
k=min1;
}
}
}
void sortare_heap(int heap1[],int n)
{
for (int i=n/2;i>=1;i--)
{
down_sift(heap1,n,i);
}
for (int i=n;i>=2;i--)
{
schimbare(heap1[i],heap1[1]);
down_sift(heap1,i-1,1);
}
}
int main()
{
freopen("algsort.in","r",stdin);
freopen("algsort.out","w",stdout);
int n;
scanf("%d ",&n);
for (int i=1;i<=n;i++)
scanf("%d ",&heap[i]);
sortare_heap(heap,n);
for (int i=1;i<=n;i++)
printf("%d ",heap[i]);
}