/* Tri naif applique a un tableau d'entiers      */

public class TriNaifGraphique {

  static final int px = 40;
  static final int py = 150;
  static final int dy = 100;
  
  static void affichage(int [] t,int px,int py) {
    EcranGraphique.drawLine(px-10,py-25,px+t.length*40-10,py-25);
    EcranGraphique.drawLine(px-10,py+10,px+t.length*40-10,py+10);
    for ( int i = 0 ; i <= t.length ; i++ )
      EcranGraphique.drawLine(px-10+i*40,py-25,px-10+i*40,py+10);
    for ( int i = 0 ; i < t.length ; i++ ) {
      EcranGraphique.drawText(px+40*i,py,EcranGraphique.COLABA8x13,"%d",t[i]); }
  }

  static void affichage(int [] t,int max,int px,int py) {
    EcranGraphique.setColor(0,0,0);
    EcranGraphique.drawLine(px-10,py-25,px+t.length*40-10,py-25);
    EcranGraphique.drawLine(px-10,py+10,px+t.length*40-10,py+10);
    for ( int i = 0 ; i <= t.length ; i++ )
      EcranGraphique.drawLine(px-10+i*40,py-25,px-10+i*40,py+10);
    for ( int i = 0 ; i < t.length ; i++ )
      if ( t[i] != max )
        EcranGraphique.drawText(px+40*i,py,EcranGraphique.COLABA8x13,"%d",t[i]);
  }
  
  static void affichage(int [] tc,int [] t,int max,int [] tInit) {
    EcranGraphique.clear();
    EcranGraphique.setColor(50,50,150);
    affichage(tInit,px,py-100);
    EcranGraphique.setColor(0,0,0);
    affichage(tc,max,px,py);
    affichage(t,max,px,py+dy);
    EcranGraphique.flush();
  }
  
  static void animation(int [] tc,int [] t,int max,int indi,int indf,int v,int [] tInit) {
    int pxi = px+indi*40;
    int pyi = py;
    int pxf = px+indf*40;
    int pyf = py+dy;
    int n =(int) (Math.sqrt((pxf-pxi)*(pxf-pxi)+(pyf-pyi)*(pyf-pyi))/4);
    for ( int i = 0 ; i < n+1 ; i++ ) {
      EcranGraphique.clear();
      EcranGraphique.setColor(50,50,150);
      affichage(tInit,px,py-100);
      EcranGraphique.setColor(0,0,0);
      affichage(tc,max,px,py);
      affichage(t,max,px,py+dy);
      int x = pxi+((pxf-pxi)*i)/n;
      int y = pyi+((pyf-pyi)*i)/n;
      EcranGraphique.drawText(x,y,EcranGraphique.COLABA8x13,"%d",v);
      EcranGraphique.wait(10);
      EcranGraphique.flush(); }
  }

/* Fonction de tri naif                          */
/* applique a un tableau d'entiers               */

  static void triNaif(int [] t,int [] tInit) {
    int [] tc = new int[t.length];
    int indice;
    int max = tc[0];
    for ( int i = 1 ; i < t.length ; i++ )
      if ( t[i] > max )
        max = t[i];
    max++;
    for ( int i = 0 ; i < t.length ; i++ ) {
      tc[i] = t[i];
      t[i] = max; }
    for ( int i = 0 ; i < t.length ; i++ ) {
      indice = t.length-1;
      for ( int j = t.length-2 ; j >= 0 ; j-- ) {
        if ( ( tc[j] != max ) && ( tc[j] < tc[indice] ) ) {
          indice = j; } }
      int v = tc[indice];
      tc[indice] = max;
      animation(tc,t,max,indice,i,v,tInit);
      t[i] = v;
      affichage(tc,t,max,tInit);
      EcranGraphique.wait(1000); }
  }
  
/* Programme principal                           */

  public static void main(String [] args) {
    int [] t = Bibliotheque.initRand(15,99);
    int [] tc = Bibliotheque.clone(t);
    EcranGraphique.init(50,50,700,370,660,290,"Tri naïf");
    EcranGraphique.setClearColor(255,255,255);
    EcranGraphique.setColor(0,0,0);
    triNaif(t,tc);
  }
}