¿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

¿Es posible codificar un programa que, dada una secuencia finita, encuentra al menos 2 reglas posibles que generan las series restantes?

¿Cuál es el algoritmo de Google Map para recomendar rutas?

¿Cuál es el enfoque algorítmico para encontrar el primer entero positivo que falta si se proporciona una matriz entera sin clasificar en O (n) complejidad de tiempo y espacio constante?

¿Somos solo un algoritmo?

¿Puede un gráfico ser un circuito de Euler y una ruta al mismo tiempo?

¿Vale la pena publicar mi algoritmo?

¿Qué es mejor si necesito elegir un camino para mi carrera, algoritmos y estructuras de datos, o tecnologías de big data, en las que estoy trabajando actualmente?

¿Dónde puedo aprender los algoritmos de clasificación y búsqueda?

Suponiendo una memoria infinita, ¿siempre es posible aumentar la complejidad de cualquier programa sin introducir redundancia?

¿Existe un algoritmo más rápido que O (kn ^ 2) para calcular las rutas más cortas k-step de una sola fuente en un gráfico ponderado?

¿Dónde es útil el conocimiento de las estructuras de datos en Swift?

Para verificar que la lista vinculada es circular, ¿cuál será la condición del bucle? Conozco un proceso adicional como tomar dos punteros. Por favor sugiérame

Entre C # y Java, ¿cuál es el mejor lenguaje de programación para aprender programación orientada a objetos, estructuras de datos y algoritmos? ¿Por qué?

Probé el problema 'Impresión espiral de matriz' durante 2 días. Incluso después de ver la solución, sigo fallando. ¿Qué tengo que hacer?

¿Utiliza el cerebro el algoritmo de propagación hacia atrás dado cómo se conectan las sinapsis secuencialmente?