/*****************************
 * Practica 4 MP
 * Curso 2008-2009
 *
 * Vicente Lujan Mansilla
 * Lorena Margareto Bisquert
 *****************************/

#include <stdlib.h>
#include <iostream>
#include <fstream>
#include "Ordenacion.h"
#include "DataGenerator.h"

using namespace std;

DataGenerator d;
VElement vE;
const int REP = 40;

void Ordenacion::testInsercion1(int ini, int end, int inc, ostream& salida, float porcentaje)
{
	vector<VElement> v;
	
	for(int talla=ini; talla<=end; talla+=inc)
	{
            VElement::initNAssign();
            VElement::initNComparison();
            
     		for(int i = 1; i <= REP; i++)
     		{
              		v.resize(talla);             
              		d.vectorOrd(v);
              		d.intercambiarElem(v,porcentaje);
              		Insercion(v);
     		}
     		
     		salida << talla << " " << (VElement::getNComparison()/REP) + (VElement::getNAssign()/REP) << endl;
     }
}         

void Ordenacion::testInsercion2(int ini, int end, int inc, ostream& salida, float porcentaje)
{
	vector<VElement> v;
	
	for(int talla=ini; talla<=end; talla+=inc)
	{
     		VElement::initNAssign();
            	VElement::initNComparison();
     		for(int i = 1; i <= REP; i++)
     		{
              		v.resize(talla);             
              		d.vectorOrdInv(v);
              		d.intercambiarElem(v,porcentaje);
		
              		Insercion(v);
     		}
		salida << talla << " " << (VElement::getNComparison()/REP) + (VElement::getNAssign()/REP) << endl;
     }
} 

void Ordenacion::testSeleccion1(int ini, int end, int inc, ostream& salida, float porcentaje)
{
	vector<VElement> v;
	
	for(int talla=ini; talla<=end; talla+=inc)
	{
            	VElement::initNAssign();
	        VElement::initNComparison();
     		for(int i = 1; i <= REP; i++)
     		{
              		v.resize(talla);             
              		d.vectorOrd(v);
              		d.intercambiarElem(v,porcentaje);
				
              		Seleccion(v);
     		}
     		salida << talla << " " << (VElement::getNComparison()/REP) + (VElement::getNAssign()/REP) << endl;     
	}
}         

void Ordenacion::testSeleccion2(int ini, int end, int inc, ostream& salida, float porcentaje)
{
	vector<VElement> v;
	
	for(int talla=ini; talla<=end; talla+=inc)
	{
            	VElement::initNAssign();
		VElement::initNComparison();
				
     		for(int i = 1; i <= REP; i++)
     		{
              		v.resize(talla);             
              		d.vectorOrdInv(v);
              		d.intercambiarElem(v,porcentaje);
			
              		Seleccion(v);

     		}
		salida << talla << " " << (VElement::getNComparison()/REP) + (VElement::getNAssign()/REP) << endl; 
     }
}

void Ordenacion::testBurbuja1(int ini, int end, int inc, ostream& salida, float porcentaje)
{
	vector<VElement> v;
	
	for(int talla=ini; talla<=end; talla+=inc)
	{     
          	VElement::initNAssign();
		VElement::initNComparison();
				
     		for(int i = 1; i <= REP; i++)
     		{
              		v.resize(talla);             
              		d.vectorOrd(v);
              		d.intercambiarElem(v,porcentaje);
			
              		Burbuja(v);
     		}
		salida << talla << " " << (VElement::getNComparison()/REP) + (VElement::getNAssign()/REP) << endl; 
     }
}         

void Ordenacion::testBurbuja2(int ini, int end, int inc, ostream& salida, float porcentaje)
{
	vector<VElement> v;
	
	for(int talla=ini; talla<=end; talla+=inc)
	{
     		VElement::initNAssign();
		VElement::initNComparison();
				
     		for(int i = 1; i <= REP; i++)
     		{
              		v.resize(talla);             
              		d.vectorOrdInv(v);
              		d.intercambiarElem(v,porcentaje);
			
              		Burbuja(v);
     		}
        	salida << talla << " " << (VElement::getNComparison()/REP) + (VElement::getNAssign()/REP) << endl; 
     }
}

void Ordenacion::testBurbujaEstudio1(int ini, int end, int inc, ostream& salida1, ostream& salida2,  float porcentaje)
{
	vector<VElement> v;
	
	for(int talla=ini; talla<=end; talla+=inc)
	{
            	VElement::initNAssign();
		VElement::initNComparison();
				
     		for(int i = 1; i <= REP; i++)
     		{
              		v.resize(talla);             
              		d.vectorOrd(v);
              		d.intercambiarElem(v,porcentaje);
			
              		Burbuja (v);
     		}
			salida1 << talla << " " << (VElement::getNComparison()/REP) << endl;
			salida2 << talla << " " << (VElement::getNAssign()/REP) << endl;
     }
}

void Ordenacion::testBurbujaEstudio2(int ini, int end, int inc, ostream& salida1, ostream& salida2,  float veces, float porcentaje)
{
	vector<VElement> v;
	
	for(int talla=ini; talla<=end; talla+=inc)
	{
     		for(int i = 1; i <= REP; i++)
     		{
              		v.resize(talla);
				  d.vectorConRepeticion(v, veces, porcentaje);             
              		Burbuja (v);
     		}
     		salida1 << talla << " " << (VElement::getNComparison()/REP) << endl;
		salida2 << talla << " " << (VElement::getNAssign()/REP) << endl;
     }
}

void Ordenacion::Insercion(vector<VElement> & v)
{
     	int i, j;
	
	for(i=v.size()-2; i>=0; i--)
	{
		v[v.size()]=v[i];
		j=i+1;
		while(v[j]<v[v.size()])
		{
			v[j-1]=v[j];
			j++;
		}
		v[j-1]=v[v.size()];
	}
} 

void Ordenacion::Seleccion(vector<VElement> & v)
{
	int pos_min;
	VElement aux;
	for(int i = 0;i<v.size()-2;i++)
	{
		pos_min=i;
		for(int j=i;j<v.size()-1;j++)
		{
			if(v[pos_min] > v[j])
				pos_min=j;
		}
		if(pos_min !=i)
		{
			aux=v[pos_min];
			v[pos_min]=v[i];
			v[i]=aux;
			
		}
	}
}

void Ordenacion::Burbuja(vector<VElement> & v)
{
	VElement aux;
	
	for(int i = 1;i<v.size();i++)
	{
		for(int j=v.size();j>i;j--)
		{
			if(v[j-1]> v[j])
			{
				aux=v[j];
				v[j]=v[j-1];
				v[j-1]=aux;
			}
		}
	}
}
 
