Pagini recente » Cod sursa (job #1724324) | Cod sursa (job #2975976) | Cod sursa (job #3149083) | Cod sursa (job #1534722) | Cod sursa (job #2401426)
#include <bits/stdc++.h>
using namespace std;
ifstream f("algsort.in");
ofstream g("algsort.out");
const int N = 500010;
int n,m,i,x[N];
void heap_down(int);
int main()
{
f>>n; m=n;
for(int i=1;i<=n;i++)
f>>x[i];
/// sortare prin metoda heap_sort
/// ( metoda de complexitate optima N log N dar mai lenta decat quicksort )
/// structuram sirul ca un max-heap
for(i=n/2;i>=1;i--)
heap_down(i);
for(i=n;i>=1;i--)
{
/// se aduce elementul cel mai mare disponibil de pe pozitia 1 pe pozitia curenta i
/// aducand astfel pe pozitia 1 valoarea de pe pozitia i
/// astfel elementul x[i] devine mai mare decat tot ce are in fata ( exact ce vrem !!! )
swap(x[i],x[1]);
/// se "scurteaza" heap-ul cu ultimul elemet care deja sta pe pozitia corecta
m--;
/// se repara structura de heap
heap_down(1);
}
for(i=1;i<=n;i++)
g<<x[i]<<' ';
return 0;
}
void heap_down(int tata)
{
int fiu=2*tata;
if(fiu>m)return;
if(fiu<m)if(x[fiu+1]>x[fiu])fiu++;
if(x[fiu]>x[tata]){swap(x[fiu],x[tata]);heap_down(fiu);}
}