/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package tp3;
import java.util.*;
import java.lang.*;
import java.io.*;

/**
 *
 * @author blossier
 */
public class Tris {
    
    private static boolean parcours(double[] T, int n) {
        boolean echange = false;
        double temp;
        for (int i = 0; i < (n - 1); i++) {
            if (T[i] > T[i + 1]) {
                // échange des valeurs
                temp = T[i];
                T[i] = T[i + 1];
                T[i + 1] = temp;
                echange = true;
            }
        }
        return echange;
    }

    public static void triABulles(double[] T) {
        int l = T.length;
        while ((l>1) && parcours(T, l)) {
            l--;
        }
    }

    // test si les deux tableaux ont les mêmes valeurs //
    public static boolean sontEgaux(double[] T, double[] S) {
        if (T.length != S.length) {
            return false;
        }
        for (int i = 0; i < T.length; i++) {
            if (T[i] != S[i]) {
                return false;
            }
        }
        return true;
    }

    //affiche les valeurs du tableau //
    public static void affiche(double[] T) {
        for (int i = 0; i < T.length; i++) {
            System.out.print(T[i] + " ");
        }
        System.out.println();
    }

    //créé un tableau aléatoire de taille n
    public static double[] tableauAleatoire(int n) {
        double[] tab = new double[n];
        for (int i = 0; i < n; i++) {
            tab[i] = Math.random();
        }
        return (tab);
    }

    //comparaisons des tris
    public static void comparaison(double[] tab) {
        System.out.println("Les algorithmes de tri à bulles et de Arrays.sort "
                + "sont en cours sur le tableau à " + tab.length + " éléments.");
        double[] tabcopie = (double[]) tab.clone();
        long tps = System.currentTimeMillis();
        Arrays.sort(tabcopie);
        tps = System.currentTimeMillis() - tps;
        System.out.println("Le tri par Arrays.sort est terminé. Temps d'exécution = " + tps + " ms.");
        tps = System.currentTimeMillis();
        triABulles(tab);
        tps = System.currentTimeMillis() - tps;
        System.out.println("Le tri à bulles est terminé. Temps d'exécution = " + tps + " ms.");
        if (sontEgaux(tab, tabcopie)){
            System.out.println("Ces deux algorithmes ont donné le même résultat.");
        } else {
            System.out.println("Ces deux algorithmes n'ont pas donné le même résultat.");
        }
    }
    
    public static void main(String[] args) throws IOException {
	int taille;
	boolean continuer = true;
	double[] tab;	

	System.out.println("Test de l'algorithme de tri à bulles sur un tableau aléatoire");

	BufferedReader entreeClavier = new BufferedReader(new InputStreamReader(System.in));

	while(continuer){
	    System.out.print("Entrer la taille du tableau aléatoire à créer : ");
	    taille = Integer.parseInt(entreeClavier.readLine());
	    tab = tableauAleatoire(taille);
	    System.out.print("Souhaitez-vous l'afficher? (Répondre O pour oui.)  ");
	    if (entreeClavier.readLine().equals("O")) affiche(tab);
	    System.out.println();
	    comparaison(tab);
	    System.out.println();
	    System.out.print("Souhaitez-vous afficher la tableau trié? (Répondre O pour oui.)  ");
	    if (entreeClavier.readLine().equals("O")) affiche(tab);
	    System.out.println();
	    System.out.print("Souhaitez-vous recommencer sur un autre tableau? (Répondre O pour oui.)  ");
	    if (!entreeClavier.readLine().equals("O")) continuer=false;
	}
   
    }  
    
}
