/* Auteur: Nicolas JANEY          */
/* nicolas.janey@univ-fcomte.fr   */
/* Fevrier 2005                   */

public class TriBulleEnConsole {

  /* Fonction de tri a bulle                              */
  /* t : tableau a trier                                  */

  public static void triBulle(int [] t) {
  /* Definition d'un booleen pour indiquer si le tri      */
  /* est fini (initialise a zero)                         */
    boolean stop = false;
  /* Definition d'un compteur pour indiquer le nombre     */
  /* de cellules deja triees                              */
    int ind = 0;
  /* Tant que le tri n'est pas fini                       */
    while ( !stop ) {
  /* stop est affecte a vrai pour indiquer que sauf       */
  /* si au moins une permutation a lieu, le tri sera fini */
      stop = true;
  /* Boucle de parcours du tableau a la recherche         */
  /* d'une permutation. Les ind premieres cellules        */
  /* etant deja triees, la boucle commence a l'indice ind */
      for ( int i = 0 ; i < t.length-1-ind ; i++ )
  /* Test de l'occurrence d'une permutation               */
  /* entre i et i+1                                       */
        if ( t[i] > t[i+1] ) {
  /* Si une permutation a lieu, le tri ne sera pas fini   */
  /* a l'issue de la boucle for -> ajustement de stop     */
          stop = false;
  /* Permutation des elements d'indice i et i+1           */
          int v = t[i];
          t[i] = t[i+1];
          t[i+1] = v; }
  /* Une cellule de plus est triee                        */
      ind++; }
  }

  /* Fonction de creation d'un tableau d'entiers          */
  /* tires au hasard                                      */
  /* taille : nombre d'entiers du tableau                 */
  /* max    : valeur maximale des entiers tires au sort   */

  public static int [] initTableau(int taille,int max) {
    int [] t = new int[taille];
    for ( int i = 0 ; i < t.length ; i++ )
      t[i] =(int) (Math.random()*(max+1));
    return(t);
  }

  /* Fonction d'affichage d'un tableau d'entiers          */
  /* t : tableau dont les valeurs doivent etre affichees  */

  public static void afficheTableau(int [] t) {
    int i;
    for ( i = 0 ; i < t.length ; i++ )
      Console.out.print(t[i]+" ");
    Console.out.println();
  }

  /* Fonction principale                                  */

  public static void main(String [] args) {
    Console.setTitle("TriBulle");
  /* Lecture au clavier des donnees initiales             */
    Console.out.print("Taille du tableau a generer et a trier : ");
    int n = Integer.valueOf(Console.in.readLine()).intValue();
    Console.out.print("Valeur maximale des entiers du tableau : ");
    int max = Integer.valueOf(Console.in.readLine()).intValue();
  /* Generation du tableau a trier tire au hasard         */
    int [] t = initTableau(n,max);
  /* Affichage du tableau non trie                        */
    Console.out.println("Tableau initial :");
    afficheTableau(t);
  /* Tri du tableau                                       */
    triBulle(t);
  /* Affichage du tableau trie                            */
    Console.out.println("Tableau trie :");
    afficheTableau(t);
  }
}