Pagini recente » Cod sursa (job #2614283) | Cod sursa (job #586059) | Cod sursa (job #3235075) | Cod sursa (job #1161991) | Cod sursa (job #640752)
Cod sursa(job #640752)
#include<iostream>
#include<cstdlib>
#include<algorithm>
#include<vector>
#include<fstream>
using namespace std;
ifstream f("algsort.in");
ofstream g("algsort.out");
vector<long int>heap(500001,0);
inline long int parinte(long int x)
{return x/2;}
inline long int fiul_stang(long int x)
{return x*2;}
inline long int fiul_drept(long int x)
{return x*2+1;}
void citire(long int &n)
{
long int i,x;
f>>n;
heap.push_back(0);
for(i=1;i<=n;i++)
{
f>>heap[i];
}
}
void afisare(long int n)
{
long int i;
for(i=1;i<=n;i++)
g<<heap[i]<<' ';
}
void heap_mic(long int x,long int n)
{
long int ok;
do
{
ok=1;
if((heap[x]<heap[fiul_stang(x)]||heap[x]<heap[fiul_drept(x)]))
{
ok=0;
if(heap[fiul_stang(x)]>heap[fiul_drept(x)])
swap(heap[x],heap[fiul_stang(x)]);
else
swap(heap[x],heap[fiul_drept(x)]);
x=parinte(x);
}
}while(ok==0&&x!=0);
}
void heap_mic_1(long int x,long int n)
{
long int ok;
do
{
ok=1;
if(fiul_drept(x)<=n&&(heap[x]<heap[fiul_stang(x)]||heap[x]<heap[fiul_drept(x)]))
{
ok=0;
if(heap[fiul_stang(x)]>heap[fiul_drept(x)])
swap(heap[x],heap[fiul_stang(x)]);
else
swap(heap[x],heap[fiul_drept(x)]);
x=parinte(x);
}
else
if(heap[x]<heap[fiul_stang(x)]&&fiul_drept(x)>n)
{
ok=0;
swap(heap[x],heap[fiul_stang(x)]);
x=parinte(x);
}
}while(ok==0&&x!=0);
}
void heap_mare(long int n)
{
long int i;
if(n/2>=1)
heap_mic_1(n/2,n);
for(i=n/2-1;i>=1;i--)
heap_mic(i,n);
}
void heap_sort(long int n)
{
long int i;
for(i=n;i>=1;i--)
{
heap_mare(i);
swap(heap[1],heap[i]);
}
}
int main()
{
long int n;
citire(n);
heap_sort(n);
afisare(n);
f.close();
g.close();
return 0;
}