Pagini recente » Cod sursa (job #1776828) | Cod sursa (job #1585056) | Cod sursa (job #1414844) | Cod sursa (job #2039780) | Cod sursa (job #410414)
Cod sursa(job #410414)
#include<stdio.h>
FILE *f=fopen("algsort.in","r");
FILE *g=fopen("algsort.out","w");
int i,a[500001],n,m,p;
void combheap(int i, int n){
int s,d;
while(2*i<=n){ //parcurgem copiii pana nu gasim unul mai mare
s=2*i; d=2*i+1; //copiii sunt 2*i si 2*i+1
m=i; // pozitia in care se gaseste maximul este m
if( a[m]<a[s] )
m=s; // daca maximul este copilul stang
if(d<=n&&a[m]<a[d] )
m=d; // daca maximul este copilul drept, si acesta exista
if(m!=i){ //daca maxim-ul nu este in nod-ul curent
int t=a[i]; //interschimbam valorile din nod-ul curent si maxim
a[i]=a[m];
a[m]=t;
i=m;
}
else break;
}
}
int main(){
fscanf(f,"%d",&n);
for(i=1;i<=n;i++)
fscanf(f,"%d",&a[i]);
for(i=n/2;i>=1;i--)
combheap(i,n);
int x;
for(i=1;i<n;i++)
{ x=a[1];
a[1]=a[n-i+1];
a[n-i+1]=x;
combheap(1,n-i);
}
for(i=1;i<=n;i++)
fprintf(g,"%d ",a[i]);
return 0;
}