tas.cpp


#include <stdlib.h>
#include <stdio.h>
#include "tas.h"
Bool inf(int i, int j)
{
 return ((i<j) ? vrai : faux) ;
}

Bool Tas::comparaison(int i, int j)
{
 if (eval==NULL)
 {
  return compare(tableau[i],tableau[j]) ;}
 return compare(eval[tableau[i]],eval[tableau[j]]);
}

void Tas::echange(int i, int j)
{
 if (i<taille_max && j<taille_max)
 {
  int temp = tableau[i] ;
  tableau[i]=tableau[j] ;
  tableau[j] = temp ;
  if (flag)
  {
   inverse[tableau[i]]=i ;
   inverse[tableau[j]]=j ;
  }

 }
}

void Tas::descend(int i)
{
 int fils = 2*i + 1 ;
 fils = ((fils<taille-1 && comparaison(fils+1,fils) ? fils+1 : fils)) ;
 if (fils<taille && comparaison(fils,i))
 {
  echange(i, fils) ;
  descend(fils) ;
 }
}

void Tas::remonte(int i)
{
 if (i>0 && comparaison(i,(i-1)/2))
 {
  echange (i,(i-1)/2) ;
  remonte ((i-1)/2) ;
 }
}

Tas::Tas(int n)
{
 taille = taille_max = n ;
 tableau = new int [n] ;
 compare = (fptr) inf ;
 flag = faux ;
 inverse = NULL ;
}

Tas::Tas(int * ptr , int n, fptr comp, int * ptr2, Bool f)
{
 taille = taille_max = n ;
 flag = f ;
 if (ptr!=NULL)
 {
  tableau = ptr ;
  eval = ptr2 ;
  if(comp!=NULL)
   compare = comp ;
  else 
   compare = (fptr) inf ;
  if (flag)
  {
   inverse = new int [taille+1] ;
   for(int i=0 ; i<taille ; i++)
   {
    if (tableau[i]>taille)
    {
     fprintf(stderr,"Tas non inversible") ;
     flag = faux ;
     break ;
    }
    inverse[tableau[i]]=i ;
   }
  }
 }
 else {
  taille = 0 ;
  tableau = NULL ;
  compare = NULL ;
  eval = NULL ;
  inverse = NULL ;
  flag = faux ;
 }
}

Tas::~Tas()
{
 if (flag)
  delete [] inverse ;
}

int Tas::GetTaille()
{
 return taille ;
}

void Tas::SetTaille (int offset)
{
 taille+=offset ;
}

int Tas::ExtrMinimum()
{
 if (taille==0)
 {
  fprintf(stderr,"Tas Vide") ;
  exit(1) ;
 }
 int mini = tableau[0] ;
 echange(0, taille-1) ;
 SetTaille(-1) ;
 descend(0) ;
 return mini ;
}

void Tas::Percolation(int i)
{
 remonte(i) ;
}

int Tas::Inverse(int i)
{
 if (flag)
  return (inverse[i]) ;
 fprintf(stderr,"Tas non inversible !") ;
 return 0 ;
}

void Tas::Tri()
{
 if (taille==0)
 {
  fprintf(stderr,"Tas Vide") ;
  exit(1) ;
 }
 for (int i=(taille/2 - 1); i>-1 ; i--)
  descend(i) ;
}