Cod sursa(job #617116)

Utilizator RuxyRezidentTMRuxandra P RuxyRezidentTM Data 13 octombrie 2011 22:13:49
Problema Sortare prin comparare Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
/*
 * algsort.cpp
 *
 *  Created on: Oct 13, 2011
 *      Author: ruxy
 */

#include<fstream>
#include<cmath>
using namespace std;

ifstream f("algsort.in");
ofstream g("algsort.out");


long int v[100],h=1;

int father (long int k, long int n)
{ if(k>1) return 1;
else return 0;
}

long int  lson(long int  k, long int n)
{ long int a=2*k;
  if(a<=n) return 1;
  else return 0;
}
long int rson(long int k, long int n)
{ long int a=2*k+1;
if(a<=n) return 1;
else return 0;
}


void sift (long int k, long int n)
{ long int aux;
 if(lson(k,n)&&rson(k,n))
	if(v[k]<v[2*k]&&v[2*k]>=v[2*k+1]) { aux=v[k]; v[k]=v[2*k]; v[2*k]=aux; sift(2*k,n);}
	else if(v[k]<v[2*k+1]&&v[2*k]<v[2*k+1]){ aux=v[k]; v[k]=v[2*k+1]; v[2*k+1]=aux; sift(2*k+1,n); }
 if(lson(k,n)&&!rson(k,n)) if(v[k]<v[2*k]) { aux=v[k]; v[k]=v[2*k]; v[2*k]=aux;}

}

void heap(long int h,long int n)
{ long int i,lim;
  lim=n/2;
  while(lim)
    	 { sift(lim,n); lim--; }

}

long int  inaltime(long int n)
{ long int i=0;
  while(h<n) { h*=2; i++;}
  return i;
}

void sortare(long int n)
{ long int  aux,n2,i;

  while(n>1)
  {
   aux=v[1];
   v[1]=v[n];
   v[n]=aux;
   n--;
   sift(1,n);
  }

}
int main()
{ long i,n;
  f>>n;
  for(i=1;i<=n;i++)
  f>>v[i];
  heap(h,n);
  sortare(n);
  for(i=1;i<=n;i++)
       g<<v[i]<<' ';

  return 0;
}