Para imprimir una lista de todas las permutaciones crecientes formadas por tres elementos del conjunto \{1,2,3,\ldots,n\}, utilizar un bucle anidado:
for i = 1 to n-2 {
for j = i+1 to n-1 {
for k = j+1 to n {
print {i,j,k}
}
}
}
Para k elementos, podría mantener la permutación en una matriz p de longitud k:
for i = 1 to k {p[i] = i}; /* initialize p to {1,2,...,k} */
repeat {
print p;
i = k;
/* find the rightmost incrementable element. p[i] can't exceed n+i-k. */
while i > 0 and p[i] == n+i-k {
i = i - 1
};
if i > 0 { /* if there exists an incrementable element... */
p[i] = p[i] + 1; /* increment it */
for j = i + 1 to k { /* and set all subsequent elts to their min values */
p[j] = p[j-1] + 1
}
}
} until i == 0
Si el conjunto está formado por elementos distintos de 1,\ 2,\ \ldots, n, y luego ordenar los elementos: a_1< a_2<\ldots< a_n. Utilice el algoritmo anterior, pero en lugar de imprimir p, imprimir los elementos indexados por p, es decir a_{p_1},\ a_{p_2},\ \ldots, a_{p_k}.
Multisets: Si los elementos no son distintos, es decir, si se nos da un multiconjunto en lugar de un conjunto, el algoritmo anterior no puede utilizarse tal cual, ya que producirá duplicados. Supongamos de nuevo que hemos ordenado los elementos: a_1\le a_2\le\ldots\le a_n.
Dado el multiconjunto \{3,5,5,5,6,6\}, por ejemplo, tenemos a_1=3, a_2=a_3=a_4=5, a_5=a_6=6. Por ejemplo, no querríamos imprimir ambos a_1a_2a_3a_5 y a_1a_2a_4a_6, ya que son la misma cosa: 3556. La solución para esto es exigir que si incluimos dos de a_2,\ a_3,\ a_4, incluimos los dos de menor índice, a saber a_2 y a_3, en lugar de a_2 y a_4 o a_3 y a_4. Asimismo, si incluimos uno de a_5,\ a_6, incluimos el de menor índice: a_5 en lugar de a_6.
Para ello, modificamos el algoritmo anterior definiendo un incremento mínimo para cada una de las n elementos ordenados del multiconjunto: r_1=1, r_2=3, r_3=2, r_4=1, r_5=2, r_6=1. El algoritmo modificado es el siguiente:
/* assume the elements a[1], a[2], ..., a[n] to be sorted in ascending order */
/* compute least increments */
r[n] = 1;
for i = n-1 downto 1 {
if a[i] == a[i+1] {r[i] = r[i+1] + 1} else {r[i] = 1}
};
/* initialize p to {1,2,...,k} */
for i = 1 to k {p[i] = i};
repeat {
for j = 1 to k {print a[p[j]]};
print <newline>;
i = k;
/* find the rightmost incrementable element. p[i] can't exceed n+i-k. */
while i > 0 and p[i]+r[p[i]] > n+i-k {
i = i - 1
};
if i > 0 { /* if there exists an incrementable element... */
p[i] = p[i] + r[p[i]]; /* increment it */
for j = i + 1 to k { /* and set all subsequent elts to their min values */
p[j] = p[j-1] + 1
}
}
} until i == 0