Pagini recente » Cod sursa (job #94368) | Cod sursa (job #1537860) | Cod sursa (job #3251764) | Cod sursa (job #1955921) | Cod sursa (job #2443142)
/**
prefixul de lungime i-1 este deja heap
si introducem pe v[i] in acest heap ada incat dupa acest pas
sa avem prefixul de lungime i ca heap
**/
#include <fstream>
using namespace std;
int n, i, v[500002], c, p;
int main () {
ifstream fin ("algsort.in");
ofstream fout("algsort.out");
fin>>n;
for (i=1;i<=n;i++)
fin>>v[i];
for (i=2;i<=n;i++) {
/// am heap cu primele i-1 elemente si bag si pe v[i]
c = i;
p = i/2;
while (p >= 1 && v[c] > v[p]) {
swap(v[c], v[p]);
c = p;
p/=2;
}
}
for (i=n;i>=2;i--) {
swap(v[1], v[i]);
/// corecteaza 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])
c++;
if (v[p] < v[c]) {
swap(v[p], v[c]);
p = c;
c = 2*c;
} else
break;
}
}
for (i=1;i<=n;i++)
fout<<v[i]<<" ";
return 0;
}