/**
*
*/
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.));
}
}