Hautens algoritme for å generere permutasjoner

Hautens algoritme brukes til å generere alle permutasjoner av N -objekter. Tanken er å generere hver permutasjon fra forrige permutasjon ved å velge et par elementer for å utveksle uten å forstyrre den andre n-2 elementer. 
Følgende er illustrasjonen av å generere alle permutasjoner av n gitte tall.
Eksempel:  

  Input:   1 2 3   Output:   1 2 3 2 1 3 3 1 2 1 3 2 2 3 1 3 2 1 

Algoritme: 

  1. Algoritmen genererer (N-1)! Permutasjoner av de første N-1-elementene som grenser til det siste elementet til hver av disse. Dette vil generere alle permutasjonene som ender med det siste elementet.
  2. Hvis n er merkelig bytte det første og siste elementet, og hvis n er til og med, så bytt i i th element (i er telleren fra 0) og det siste elementet og gjenta algoritmen ovenfor til jeg er mindre enn n.
  3. I hver iterasjon vil algoritmen produsere alle permutasjoner som ender med det nåværende siste elementet.

Implementering:   

C++
   // C++ program to print all permutations using   // Heap's algorithm   #include          using     namespace     std  ;   // Prints the array   void     printArr  (  int     a  []     int     n  )   {      for     (  int     i     =     0  ;     i      <     n  ;     i  ++  )      cout      < <     a  [  i  ]      < <     ' '  ;      printf  (  '  n  '  );   }   // Generating permutation using Heap Algorithm   void     heapPermutation  (  int     a  []     int     size       int     n  )   {      // if size becomes 1 then prints the obtained      // permutation      if     (  size     ==     1  )     {      printArr  (  a       n  );      return  ;      }      for     (  int     i     =     0  ;     i      <     size  ;     i  ++  )     {      heapPermutation  (  a       size     -     1       n  );      // if size is odd swap 0th i.e (first) and       // (size-1)th i.e (last) element      if     (  size     %     2     ==     1  )      swap  (  a  [  0  ]     a  [  size     -     1  ]);      // If size is even swap ith and       // (size-1)th i.e (last) element      else      swap  (  a  [  i  ]     a  [  size     -     1  ]);      }   }   // Driver code   int     main  ()   {      int     a  []     =     {     1       2       3     };      int     n     =     sizeof     a     /     sizeof     a  [  0  ];      heapPermutation  (  a       n       n  );      return     0  ;   }   
Java
   // Java program to print all permutations using   // Heap's algorithm   import     java.io.*  ;   class   HeapAlgo     {      // Prints the array      void     printArr  (  int     a  []       int     n  )      {      for     (  int     i     =     0  ;     i      <     n  ;     i  ++  )      System  .  out  .  print  (  a  [  i  ]     +     ' '  );      System  .  out  .  println  ();      }      // Generating permutation using Heap Algorithm      void     heapPermutation  (  int     a  []       int     size       int     n  )      {      // if size becomes 1 then prints the obtained      // permutation      if     (  size     ==     1  )      printArr  (  a       n  );      for     (  int     i     =     0  ;     i      <     size  ;     i  ++  )     {      heapPermutation  (  a       size     -     1       n  );      // if size is odd swap 0th i.e (first) and      // (size-1)th i.e (last) element      if     (  size     %     2     ==     1  )     {      int     temp     =     a  [  0  ]  ;      a  [  0  ]     =     a  [  size     -     1  ]  ;      a  [  size     -     1  ]     =     temp  ;      }      // If size is even swap ith       // and (size-1)th i.e last element      else     {      int     temp     =     a  [  i  ]  ;      a  [  i  ]     =     a  [  size     -     1  ]  ;      a  [  size     -     1  ]     =     temp  ;      }      }      }      // Driver code      public     static     void     main  (  String     args  []  )      {      HeapAlgo     obj     =     new     HeapAlgo  ();      int     a  []     =     {     1       2       3     };      obj  .  heapPermutation  (  a       a  .  length       a  .  length  );      }   }   // This code has been contributed by Amit Khandelwal.   
Python3
   # Python program to print all permutations using   # Heap's algorithm   # Generating permutation using Heap Algorithm   def   heapPermutation  (  a     size  ):   # if size becomes 1 then prints the obtained   # permutation   if   size   ==   1  :   print  (  a  )   return   for   i   in   range  (  size  ):   heapPermutation  (  a     size  -  1  )   # if size is odd swap 0th i.e (first)   # and (size-1)th i.e (last) element   # else If size is even swap ith   # and (size-1)th i.e (last) element   if   size   &   1  :   a  [  0  ]   a  [  size  -  1  ]   =   a  [  size  -  1  ]   a  [  0  ]   else  :   a  [  i  ]   a  [  size  -  1  ]   =   a  [  size  -  1  ]   a  [  i  ]   # Driver code   a   =   [  1     2     3  ]   n   =   len  (  a  )   heapPermutation  (  a     n  )   # This code is contributed by ankush_953   # This code was cleaned up to by more pythonic by glubs9   
C#
   // C# program to print all permutations using   // Heap's algorithm   using     System  ;   public     class     GFG     {      // Prints the array      static     void     printArr  (  int  []     a       int     n  )      {      for     (  int     i     =     0  ;     i      <     n  ;     i  ++  )      Console  .  Write  (  a  [  i  ]     +     ' '  );      Console  .  WriteLine  ();      }      // Generating permutation using Heap Algorithm      static     void     heapPermutation  (  int  []     a       int     size       int     n  )      {      // if size becomes 1 then prints the obtained      // permutation      if     (  size     ==     1  )      printArr  (  a       n  );      for     (  int     i     =     0  ;     i      <     size  ;     i  ++  )     {      heapPermutation  (  a       size     -     1       n  );      // if size is odd swap 0th i.e (first) and      // (size-1)th i.e (last) element      if     (  size     %     2     ==     1  )     {      int     temp     =     a  [  0  ];      a  [  0  ]     =     a  [  size     -     1  ];      a  [  size     -     1  ]     =     temp  ;      }      // If size is even swap ith and      // (size-1)th i.e (last) element      else     {      int     temp     =     a  [  i  ];      a  [  i  ]     =     a  [  size     -     1  ];      a  [  size     -     1  ]     =     temp  ;      }      }      }      // Driver code      public     static     void     Main  ()      {      int  []     a     =     {     1       2       3     };      heapPermutation  (  a       a  .  Length       a  .  Length  );      }   }   /* This Java code is contributed by 29AjayKumar*/   
JavaScript
    <  script  >   // JavaScript program to print all permutations using   // Heap's algorithm   // Prints the array   function     printArr  (  a    n  )   {      document  .  write  (  a  .  join  (  ' '  )  +  '  
'
); } // Generating permutation using Heap Algorithm function heapPermutation ( a size n ) { // if size becomes 1 then prints the obtained // permutation if ( size == 1 ) printArr ( a n ); for ( let i = 0 ; i < size ; i ++ ) { heapPermutation ( a size - 1 n ); // if size is odd swap 0th i.e (first) and // (size-1)th i.e (last) element if ( size % 2 == 1 ) { let temp = a [ 0 ]; a [ 0 ] = a [ size - 1 ]; a [ size - 1 ] = temp ; } // If size is even swap ith // and (size-1)th i.e last element else { let temp = a [ i ]; a [ i ] = a [ size - 1 ]; a [ size - 1 ] = temp ; } } } // Driver code let a = [ 1 2 3 ]; heapPermutation ( a a . length a . length ); // This code is contributed by rag2127 < /script>

Produksjon
1 2 3 2 1 3 3 1 2 1 3 2 2 3 1 3 2 1  

Tidskompleksitet: O (n*n!) Hvor n er størrelsen på den gitte matrisen.
Hjelpeplass: O (n) for rekursiv stabelplass i størrelse N.

Referanser:  
1. 'https://en.wikipedia.org/wiki/heap%27s_algorithm#cite_note-3