Pagini recente » Cod sursa (job #1570425) | Cod sursa (job #1570475) | Cod sursa (job #2471443) | Cod sursa (job #1165966) | Cod sursa (job #2704749)
//heapsort
#include <fstream>
using namespace std;
ifstream fin("algsort.in");
ofstream fout("algsort.out");
int n,i,v[500002],fiu,tata;
int main(){
fin>>n;
for(i=1;i<=n;i++)
fin>>v[i];
for(i=2;i<=n;i++){ //form heap cu i elem, avand deja i-1 fixate
fiu=i; // fiuul k are fii 2*k,2*k+1
tata=i/2;
while(tata>=1 && v[fiu]>v[tata]){
swap(v[tata],v[fiu]);
fiu=tata;
tata/=2;
}
}
for(i=n;i>1;i--){
swap(v[1],v[i]); //aduc maximul ultima pozitie nefixata deja
//corectez heapul stricat de radacina
tata=1;
fiu=2;
while(fiu<i){ //i e deja la locul lui
if(fiu+1<i && v[fiu+1]>v[fiu]) //exista fiu in dr mai mare
fiu++;
if(v[tata]<v[fiu])
swap(v[tata],v[fiu]);
else break;
tata=fiu;
fiu*=2;
}
}
for(i=1;i<=n;i++)
fout<<v[i]<<" ";
return 0;
}