Cod sursa(job #617113)

Utilizator RuxyRezidentTMRuxandra P RuxyRezidentTM Data 13 octombrie 2011 22:09:11
Problema Sortare prin comparare Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 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");


unsigned long long v[100],h=1;

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

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


void sift (unsigned long long k, unsigned long long n)
{ unsigned long long 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(unsigned long long h,unsigned long long n)
{ unsigned long long i,lim;
  lim=n/2;
  while(lim)
    	 { sift(lim,n); lim--; }

}

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

void sortare(unsigned long long n)
{ unsigned long long 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;
}