Pagini recente » Cod sursa (job #2306740) | Cod sursa (job #398229) | Cod sursa (job #2195025) | Cod sursa (job #2293357) | Cod sursa (job #2492994)
/// HEAPSORT
#include <fstream>
using namespace std;
ifstream fin("algsort.in");
ofstream fout("algsort.out");
int n, i, v[1000001], p, c;
int main(){
/// in prima instanta, vreau ca orice parinte sa fie mai mare decat fiii lui
/// cat timp un numar este mai mare decat cel de dinainte din lant, il mut
fin>>n;
for(i=1;i<=n;i++){
fin>>v[i];
p = i/2;
c = i;
while(v[c] > v[p] && p > 0){
swap(v[c], v[p]);
c = p;
p /= 2;
}
}
/// acum, caut sa pun varful heapului cat mai aproape de final
/// pentru asta, duc fiecare nod plecand de la final in varful heapului
/// varful anterior al heapului trece pe pozitia curenta
/// si apoi repar stricaciunile cauzate de modificarea heapului
/// adica refac heapul
/// dupa refacere, in varf voi avea un maxim corect, din heapul ramas
/// iar la pasul urmator, il voi pune la final, la urmatoarea pozitie curenta, dupa cel pus la pasul acesta
/// acela este sigur mai mare decat cel nou
/// si apar puse descrescator de la final la inceput
/// adica, practic, sortate crescator
/// de fapt, algoritmul pune maximele in ordine la final
/// si reface heapul dupa eliminarea lor
for(i=n;i>0;i--){
swap(v[1], v[i]);
p = 1;
c = 2;
if(v[c] < v[c+1] && c+1 < i)
c++;
while(v[c] > v[p] && c < i){
swap(v[c], v[p]);
p = c;
c *= 2;
if(v[c] < v[c+1] && c+1 < i)
c++;
}
}
for(i=1;i<=n;i++)
fout<<v[i]<<" ";
return 0;
}