Pagini recente » Cod sursa (job #2352920) | Cod sursa (job #1050895) | Cod sursa (job #144830) | Cod sursa (job #1510248) | Cod sursa (job #2492989)
/// HEAPSORT
#include <fstream>
using namespace std;
ifstream fin("algsort.in");
ofstream fout("algsort.out");
int n, i, v[1000001], p, c, minim;
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;
fin>>v[1];
minim = v[1];
for(i=2;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;
}
if(v[i] < minim)
minim = v[i];
}
/// 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++;
while(v[c] > v[p] && c < i){
swap(v[c], v[p]);
p = c;
c *= 2;
if(v[c] < v[c+1])
c++;
}
}
for(i=1;i<=n;i++)
fout<<v[i]<<" ";
return 0;
}