Pagini recente » Cod sursa (job #927652) | Cod sursa (job #659143) | Cod sursa (job #2046612) | Cod sursa (job #975314) | Cod sursa (job #2704354)
#include <fstream>
using namespace std;
int v[500010];
int n, i, c, p;
ifstream fin ("algsort.in");
ofstream fout("algsort.out");
int main () {
fin>>n;
for (i=1;i<=n;i++)
fin>>v[i];
/**
7 6 4 5 8 2 9 1
1 7 4 5 6 2 8 9
8
7 4
5 6 2 1
9
**/
for (i=2;i<=n;i++) {
/// am deja heap cu primele i-1 elemente si il transform in heap cu
/// i elemente
c = i;
p = i/2;
while (p >= 1 && v[c] > v[p]) {
swap(v[c], v[p]);
c = p;
p = p/2;
}
}
for (i=n;i>=2;i--) {
swap(v[1], v[i]);
/// corectez heapul cu i-1 elemente "stricat" doar de radacina
p = 1;
c = 2;
while (c <= i-1) {
if (c + 1 <= i-1 && v[c+1] > v[c]) /// daca fratele drept al radacinii e in heap
c++;
if (v[p] < v[c])
swap(v[p], v[c]);
else
break;
p = c;
c = 2*c; /// initializez mereu c cu fiul stang al parintelui
}
}
for (i=1;i<=n;i++)
fout<<v[i]<<" ";
return 0;
}