/*
 * @author	Pedro Andres Ortega Mossos
 * @Codigo  257076
 * @Grupo    1
*/
 
 
 
import java.applet.Applet;
import java.awt.*;    
import java.awt.event.*;  
import java.util.Random;


public class IS2 extends Applet implements ActionListener 
{	
  
	static long total = 0;
	static long npermut = 0;
	static double prob[] = new double[5000];
	static int cases [] = new int[5000];
	static int minCase=5000;
	static int maxCase=0;
	static int n=4;
	Label prompt;      
  TextField input;   
  TextArea output;

	ScrollPane outputScrollPane;


 static int isortSteps(int aux[])
 {
	
		int steps = 0;
		int i,j,k,x;
		
		int v[] = new int[aux.length];
		for(i=0;i < v.length; i++) v[i]=aux[i];
		

		for(i=1;i < v.length; i++)
		{
		  x = v[i];
			j = i-1;
			
			
		  while( (j > -1)&& (v[j] > x)  ){
					v[j+1] = v[j];
					j--;	
					steps+=3;
					
			}
			steps++;
			
			v[j+1] = x;
			
			
		}
		steps += (4*v.length)-3;
		
		return steps;
		
	}

 static void swap (int v[], int i, int j) {
	int	t;

	t = v[i];
	v[i] = v[j];
	v[j] = t;
	}



static void perm (int v[],int i, int n) {
			int k = 0;

		for (int j = 1; j < 100000; j++) {

			Random r = new Random();
        for(int c = 0; c < n; c++)
            v[c] = r.nextInt(n) + 1;


			npermut++;
			k = isortSteps(v);
			total += k;
			cases[k]++;
		}

	}

	public void init()
   {
      prompt = new Label( "Enter n:" );
      add( prompt );  
      input = new TextField( 2 );
      input.setText(Integer.toString(n));
			add( input );   
     
      input.addActionListener( this );
      
      output = new TextArea();
		add(output);
   }

   
   public void actionPerformed( ActionEvent e )
   {
      
      n = Integer.parseInt( e.getActionCommand() );
     	input.setText(Integer.toString(n));  
     	repaint(); 
   }
		
	
	
	
	public void paint(Graphics g) {
		
		int k = 0;
	 	int v[] = new int[n];
		total = 0;
		npermut = 0;
		minCase=50000;
		maxCase=0;
		prompt.setLocation(155, 10);
		input.setLocation(220, 10);
		output.setText("");
		output.setBounds(400, 50, 200, 280);	
		
		for(k=0; k<5000; k++) {
			cases[k] = 0;
		}
		
		for(k=0; k<n; k++){
				v[k]=k+1;
		} 
		
		perm(v,0,n);
  	
		for(k=0; k<5000; k++){
					prob[k] = (double)cases[k]/  (double)npermut;
					if (( cases[k] != 0) && (minCase > k)) minCase = k;
					if (( cases[k] != 0) && (maxCase < k)) maxCase = k;
					
					
		}
	
		
		int i = 0;
		
		g.setColor(Color.black);
		g.drawString("Probability",10,50);
		g.drawString("Steps",350,340);
		g.drawString("n = "+n,155,50);
		g.drawString("Number of permutations = "+ npermut,155,65);
		g.drawString("Average number of steps =  " + +((double) total)/((double)npermut) ,50,380);
		
		int y = 80;
		for(i=minCase; i <= maxCase; i++) {
			if ( cases[i] != 0){
				y += 15;
				output.append("P("+i+")="+prob[i]+" ["+cases[i]+"]\n");
			}
		}
		
		g.setColor(Color.red);
		g.drawLine(50,50,50,320);
		g.drawLine(50,320,350,320);	
		
		g.setColor(Color.black);
		
		g.drawString("1.0", 10, 70);
		g.drawString("0.8", 10, 120);
		g.drawString("0.6", 10, 170);
		g.drawString("0.4", 10, 220);
		g.drawString("0.2", 10, 270);
		g.drawString("0.0", 10, 320);
		
		int yf;
		int shift = (int) (200.0/(double)(maxCase-minCase+1));
		int ishift = (int) (100.0/(double)(maxCase-minCase+1));
		g.setColor(Color.blue);
		for (i=minCase; i< (maxCase+1); i=i+1){
		  yf = (int) (prob[i] *250.0) ;
			g.fillRect(50+((i-minCase)*shift),320-yf, shift, yf);
			g.drawString(""+i,50+ishift+((i-minCase)*shift) , 330);
		
		}
		
		
	}		
	
	
}


