/* Tri a bulle d'un tableau de chaines         */
/* de caracteres                               */

public class TriBulleTableauDeChainesEnConsole {

/////////////////////////////////////////////////

/* Fonction de comparaison de deux chaines     */
/* de caracteres de longueurs identiques       */
/* vis a vis de l'ordre alphabetique           */
/* Valeur entiere retournee:                   */
/*   0  si chaines egales                      */
/*   -1 si la premiere chaine est avant        */
/*      la seconde par ordre alphabetique      */
/*   1  si la premiere chaine est apres        */
/*      la seconde par ordre alphabetique      */

  static int ordre(String s1,String s2) {
    char [] t1 = Chaine.tableauCaracteres(s1);
    char [] t2 = Chaine.tableauCaracteres(s2);
    int lc = t1.length;
    int res = 0;
    int i = 0;
    boolean go = true;
    while ( go ) {
      if ( i == lc ) {
        go = false; }
        else {
        if ( t1[i] < t2[i] ) {
          go = false;
          res = -1; }
          else {
          if ( t1[i] > t2[i] ) {
            go = false;
            res = 1; } } }
      i++; }
    return(res);
  }

/* Fonction de tri par ordre alphabetique      */
/* d'un tableau de chaines de caracteres       */
/* Technique de tri: Tri a bulle               */

  static void triBulleTableauDeChaines(String [] t) {
    String aux;
    boolean permutation;
    int np = t.length-1;
    do {
      permutation = false;
      for ( int j = 0 ; j < np ; j++ ) {
        if ( ordre(t[j],t[j+1]) > 0 ) {
          aux = t[j];
          t[j] = t[j+1];
          t[j+1] = aux;
          permutation = true; } }
      np--; }
    while ( permutation ) ;
  }

/////////////////////////////////////////////////

/* Fonction d'affichage d'un tableau           */
/* de chaines de caracteres                    */

  static void affichage(String [] ts) {
    for ( int i = 0 ; i < ts.length ; i++ ) {
      Console.afficherln(ts[i]); }
  }

/* Fonction de tirage au sort d'un nombre      */
/* entier compris dans un intervalle [min,max] */

  static int random(int min,int max) {
    int v = min +(int) (Math.random()*(max-min+1));
    return v;
  }

/* Fonction de creation d'une chaine           */
/* de caracteres de longueur l                 */
/* et composee de caracteres                   */
/* minuscules tires au sort                    */

  static String chaineDeCaracteres(int l) {
    String s = "";
    char c;
    for ( int i = 0 ; i < l ; i++ ) {
      c =(char) random(97,122);
      s = s + c; }
    return s;
  }

/* Programme principal                         */

  public static void main(String [] args) {
    Console.setTitle("TriBulleTableauDeChaines");
    int n;
    int l;
    String [] ts;
    Console.afficher("Nombre de chaines? ");
    n = Console.saisirInt();
    Console.afficher("Longueur? ");
    l = Console.saisirInt();
    ts = new String[n];
    for ( int i = 0 ; i < n ; i++ ) {
      ts[i] = chaineDeCaracteres(l); }
    Console.sautDeLigne();
    affichage(ts);
    Console.sautDeLigne();
    triBulleTableauDeChaines(ts);
    affichage(ts);
  }
}