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

public class TriSelection2EnConsole {

  /* Fonction de recherche de l'indice du plus petit      */
  /* element d'un tableau d'entiers                       */
  /* t   : tableau ou effectuer la recherche              */
  /* deb : indice a partir duquel commencer la recherche  */
  /* fin : indice jusqu'auquel effectuer la recherche     */

  public static int indiceDuMinimum(int [] t,int deb,int fin) {
    int ind = deb;
    for ( int i = deb+1 ; i <= fin ; i++ )
      if ( t[i] < t[ind] )
        ind = i;
    return(ind);
  }

  /* Fonction de tri par selection                        */
  /* t : tableau a trier                                  */

  public static void triSelection(int [] t) {
  /* Pour tous les indices deb jusqu'a l'anvant dernier   */
    for ( int deb = 0 ; deb < t.length-1 ; deb++ ) {
  /* Calcul de l'indice i du minimum                      */
  /* de deb jusqu'a fin du tableau                        */
      int i = indiceDuMinimum(t,deb,t.length-1);
      Console.out.println("Iteration "+deb+"; indice du minimum : "+i);
  /* Permutation des elements d'indice i et deb           */
      int v = t[deb];
      t[deb] = t[i];
      t[i] = v;
      afficheTableau(t); }
  }

  /* 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("TriSelection2");
  /* 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                                       */
    triSelection(t);
  /* Affichage du tableau trie                            */
    Console.out.println("Tableau trie :");
    afficheTableau(t);
  }
}