import java.util.*;
class Permutaciones
{
public ArrayList permutacion, permutacionIt;
public Permutaciones(){
permutacion = new ArrayList();
permutacionIt = new ArrayList();
}
public void Permutacion(String prefijo, String sufijo )
{
String nuevoPrefijo, nuevoSufijo;
int numDeCaracteres = sufijo.length();
if( numDeCaracteres == 1)
{
//permutacion.add(new String(prefijo + sufijo));
System.out.println(prefijo + sufijo);
}
else
{
for(int i = 0; i < numDeCaracteres; i++)
{
nuevoSufijo = sufijo.substring(1,numDeCaracteres);
nuevoPrefijo = prefijo + sufijo.charAt(0);
Permutacion(nuevoPrefijo,nuevoSufijo);
sufijo = nuevoSufijo + sufijo.charAt(0);
}
}
}
public void PermutacionIterativo(char[] ps)
{
//permutacionIt.add(new String(ps));
System.out.println(ps);
int n = ps.length;
char tmp = '0';
int[] indexes = new int[n];
for (int i=0; i<n-1; ) indexes[i] = ++i;
for (int i = n-2; i >= 0;) {
tmp = ps[indexes[i]];
ps[indexes[i]] = ps[i];
ps[i] = tmp;
indexes[i]++;
//permutacionIt.add(new String(ps));
System.out.println(ps);
i = n-2;
while (i >= 0 && indexes[i] >= n) {
tmp = ps[i];
for (int k = i; k < n-1;)
ps[k] = ps[++k];
ps[n-1] = tmp;
indexes[i]=i+1;
i--;
}
}
}
public static void main (String args [])
{
Permutaciones palabra = new Permutaciones();
String cad = "0123456789";
/**********************************
* PARTE RECURSIVA *
**********************************/
System.out.println("Permutaciones: ");
long inicioRe = System.currentTimeMillis();
palabra.Permutacion("",cad);
long finRe = System.currentTimeMillis(); ;
//for(int i=0;i<palabra.permutacion.size();i++){
// System.out.println((String)palabra.permutacion.get(i));
//}
/**********************************
* PARTE ITERATIVA *
**********************************/
long inicioIt = System.currentTimeMillis();
palabra.PermutacionIterativo(cad.toCharArray());
long finIt = System.currentTimeMillis();
//for(int i=0;i<palabra.permutacionIt.size();i++){
// System.out.println((String)palabra.permutacionIt.get(i));
//}
System.out.println("Tiempo total Iterativo: "+(finIt-inicioIt)+"ms");
System.out.println("Tiempo total Recursivo: "+(finRe-inicioRe)+"ms");
}
}