Package

Source Code of TriRapide

/**
*
*/

import inf231v.sequences.Observateur;

/**
* @author serasset
*
*/
public class TriRapide {

  SequenceContigueLongueurExplicite seq;
  Observateur obs = null;
  int nbComp = 0;
  int nbModif = 0;
  /**
   * construit un TriRapide observable prenant ses données dans "data"
   *
   */
  public TriRapide () {
    this("data", true);
  }
 
  /**
   * construit un TriRapide  prenant ses données dans "data".
   * Ce tri est observable ssi observable est vrai.
   *
   */ 
  public TriRapide (boolean observable) {
    this("data", observable);
  }
 
  /**
   * construit un TriRapide  prenant ses données dans filename.
   * Ce tri est observable ssi observable est vrai.
   *
   */ 
  public TriRapide (String filename, boolean observable) {
                // génération d'une séquence aléatoire
    seq = new SequenceContigueLongueurExplicite(filename);
    if (observable) {
      obs = new Observateur("Tri rapide");
    }
  }
 
  public TriRapide (int l, boolean observable) {
    seq = new SequenceContigueLongueurExplicite(l);
    if (observable) {
      obs = new Observateur("Tri rapidee", 3);
    }
  }
 
  public void trier() {
    if (obs != null) {
      obs.dessineSequence(seq.t, seq.l);
      obs.dormir();
    }
    trier(0, seq.l-1);
    if (obs != null) {
      obs.dessineSequence(seq.t, seq.l);
      obs.dormir();
    }
  }
 
  public void trier(int binf, int bsup) {
    nbComp++;
    if (binf < bsup) {
      // Couper la séquence en 2 parties
      if (obs != null) {
        obs.dessineSequence(seq.t, seq.l);
        obs.enNoir(binf);
        obs.enNoir(bsup);
        obs.dormir();
      }
      nbModif++;
      int c = placer(binf, bsup);
     
      // et trier chaque séquence
      trier(binf, c-1);
      trier(c+1, bsup);
    }
  }
 
        /**
          * Dans la deuxième partie du TDE : rajouter l'affichage du nombre
          * de comparaison et du nombre d'échange.
          */
  public int placer(int binf, int bsup) {
    // Coupure de la séquence t[binf..bsup] ayant au moins 2 éléments
    //LEXIQUE
    int s;
    int i;
    int tmp;
    // INVARIANT: PYYYYYY________ZZZZZZZZZ
    //            |      |      |        |
    //           binf    i      s       bsup
    // les Y sont <= P, les Z sont > P, les _ n'ont pas été traités.
   
    //REALISATION
    i = binf+1;
    s = bsup;

    while(i <= s) {
      while(s >= i && seq.t[s] > seq.t[binf]) s--; // t[s] <= P
      while(i <= s && seq.t[i] <= seq.t[binf]) i++; // t[i] > P
      if(i < s) {
        tmp = seq.t[s];
        seq.t[s] = seq.t[i];
        seq.t[i] = tmp;
        s--; i++;
        if (obs != null) {
          obs.dessineSequence(seq.t, seq.l);
          obs.enRouge(i);
          obs.enRouge(s);
          obs.dormir();
        }
      }
    }
    tmp = seq.t[s];
    seq.t[s] = seq.t[binf];
    seq.t[binf] = tmp;
   
    if (obs != null) {
      obs.dessineSequence(seq.t, seq.l);
      obs.dormir();
    }
    return s;
  }
 
  /**
   * @param args
   */
  public static void main(String[] args) {
    // TODO Auto-generated method stub
    TriRapide trirap;
    /**trirap.seq.afficher();
    trirap.trier();
    trirap.seq.afficher();*/
    int i =0;
    double sommeComp = 0;
    double sommeModif = 0;
    while(i != 100){
      trirap = new TriRapide(100, false);
      trirap.trier();
      sommeComp += trirap.nbComp;
      sommeModif += trirap.nbModif;
      System.out.println("Tri numero  "+ i +" : nbComp = " + trirap.nbComp + ", nbModif = " + trirap.nbModif);
      i++;
    }
    System.out.println("Moyenne des 100 tries : moyComp = "+(sommeComp/100.)+", moyModif = "+(sommeModif/100.));
  }



}
TOP

Related Classes of TriRapide

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.