package tp.tableau;

import java.util.Random;

import bioinfo.utile.Saisie;

public class Tableau 
{
	int[] tableau;
	
	public Tableau()
	{
		Saisie s = new Saisie();
		System.out.println("Combien d'éléments souhaitez-vous mettre dans le tableau ?");
		int nbElements = s.getEntier();
		tableau = new int[nbElements];
		for(int i=0;i<nbElements;i++)
		{
			System.out.println("Quelle est la valeur à la position "+(i+1)+" ?");
			tableau[i] = s.getEntier();
		}
	}
	
	public Tableau(int nbElements)
	{
		tableau = new int[nbElements];
		Random r = new Random();
		for(int i=0;i<nbElements;i++)
			tableau[i] = r.nextInt(101);
	}
	
	public Tableau(Tableau t)
	{
		tableau = new int[t.tableau.length];
		for(int i=0;i<tableau.length;i++)
			tableau[i] = t.tableau[i];
	}
	
	/**
	 * Insérer l'élément de la position i à la position j, avec j<i
	 */
	public void insererElement(int i, int j, Mesure m)
	{
		int valeur = tableau[i];	m.ajoutAffectation();
		for(int k=i;k>j;k--){
			tableau[k]=tableau[k-1];	m.ajoutAffectation();
		}
		tableau[j] = valeur;	m.ajoutAffectation();
	}
	
	/**
	 * inverser les éléments des positions i et j
	 */
	public void inverserElements(int i, int j, Mesure m)
	{
		int valeur = tableau[i];	
		m.ajoutAffectation();
		tableau[i]=tableau[j];	
		m.ajoutAffectation();
		tableau[j] = valeur;	 
		m.ajoutAffectation();
	}
	
	public void triSelection(Mesure m)
	{
		long debut = System.nanoTime();
		for(int i=0;i<tableau.length-1;i++)
		{
			int pos = i;
			for(int j=i+1;j<tableau.length;j++)
			{
				m.ajoutTest();
				if(tableau[pos]>tableau[j])
				{
					pos = j; 
				}
			}
			inverserElements(pos, i, m);
		}
		long fin = System.nanoTime();
		m.ajoutDuree(fin-debut);
	}
	
	public void triInsertion(Mesure m)
	{
		long debut = System.nanoTime();
		for(int i=1;i<tableau.length;i++)
		{
			int pos = i-1;
			while(pos>=0 && tableau[pos]>tableau[i])
			{
				pos--;
				m.ajoutTest();
			} 
			m.ajoutTest();
			insererElement(i, pos+1, m);
		}
		long fin = System.nanoTime();
		m.ajoutDuree(fin-debut);
	}
	
	public String toString()
	{
		StringBuffer buf = new StringBuffer();
		for(int i=0;i<tableau.length;i++)
			buf.append(tableau[i]+" ");
		return buf.toString();
	}
	
	public static void main(String[] args){
		Mesure m = new Mesure();
		Tableau t = new Tableau();
		Tableau t2 = new Tableau(t);
		System.out.println("T : "+t);
		t.triSelection(m);
		System.out.println("T trié : "+t);
		m = new Mesure();
		System.out.println("T2 : "+t2);
		t2.triInsertion(m);
		System.out.println("T2 trié : "+t2);
	}
}
