¿Cuál es el mejor algoritmo para implementar la función next_permutation sin STL?

Como lo han señalado otros, consulte el enlace StackOverflow para obtener una explicación. Puede usar la función ‘NextPermutation’ para una implementación de C ++ 11. Desafortunadamente, no funciona para los iteradores para mantener el ejemplo simple. He asumido un vector genérico en su lugar.

  #include 
 #include 
 #include 

 usando el espacio de nombres estándar;

 plantilla 
 bool NextPermutation (std :: vector  & elems) {
   const int N = elems.size ();

   int li = -1;  // Último índice para el cual elems [i + 1]> elems [i].
   int next_candidate_index = li + 1;
   para (int i = 0; i <N; ++ i) {
     if ((i + 1  elems [i]) {
       li = i;
       next_candidate_index = li + 1;
     }
     if (li> = 0 && elems [i]> elems [li] &&
         elems [i] <elems [next_candidate_index]) {
       next_candidate_index = i;
     }
   }

   si (li == -1) {
     falso retorno;
   }

   swap (elems [li], elems [next_candidate_index]);
   reverse (elems.begin () + li + 1, elems.end ());

   volver verdadero;
 }

 plantilla 
 vector <vector > GetPermutations (const vector  & e) {
   permutaciones de vector <vector >;

   std :: vector  elems (e);
   sort (elems.begin (), elems.end ());

   hacer {
     permutations.emplace_back (elems);
   } while (NextPermutation (elems));

   permutaciones de retorno;
 }

 int main () {
   std :: vector  v {1, 2, 3, 4, 5};
   permisos automáticos = GetPermutations (v);
   cout << perms.size () << endl;
   para (auto && p: perms) {
     cout << "{";
     para (auto && i: p) {
       cout << i << "";
     }
     cout << "} \ n";
   }
   devuelve 0;
 }

Gracias Raziman, por el enlace en el comentario.

std :: next_permutation Implementación Explicación

Esta es realmente la mejor explicación que puedes encontrar. No se me ocurre ponerlo más claro que esto.

More Interesting

¿Qué es un filtro de Kalman?

¿Cómo puede un programador competitivo construir cosas solo por algoritmo y un lenguaje y nada sobre la web?

¿Cómo podemos generar un número aleatorio con igual probabilidad en el rango [1 ... n] st, no pertenece al conjunto inválido de números S = {xi | 1 <= xi <= n e i [matemáticas] \ en [/ matemáticas] [1… k] yk <n} utilizando la memoria O (k); siempre que podamos llamar a la función aleatoria solo una vez?

¿Cuáles son los libros de Ciencias de la Computación (Algoritmo) que recomendará un topcoder?

¿Qué es la recursividad en matemáticas?

¿Qué significa que el algoritmo TD (en el aprendizaje por refuerzo) hace predicción y no control?

¿Cuál es la mejor manera de extrapolar una señal dispersa que proviene de un filtro de Kalman?

¿Cómo lidiar con la gestión eficiente de versiones y la compresión de múltiples versiones para bases de datos científicas?

¿Qué es mejor: una lista enlazada de codificación o el uso de libs de plantillas estándar?

¿Por qué necesito el complemento de un gráfico?

¿Por qué se utilizan montones para la asignación de memoria? ¿Por qué no se utilizan pilas ni ninguna otra?

¿Hay sitios web dedicados al aprendizaje de algoritmos y la teoría de los autómatas?

¿Cómo funciona la detección de vandalismo de Wikipedia?

¿Cuál es una explicación intuitiva del ataque de cumpleaños en criptografía?

¿Cómo demostramos que el algoritmo de codificación de Huffman es óptimo?