// output of ./demo/comb/perm-heap2-demo.cc:
// Description:
//% Gray code for permutations, CAT algorithm, optimized version.
//% Optimized implementation, quite fast.
//% Algorithm following
//% B. R. Heap: Permutations by Interchanges,
//% The Computer Journal, vol. 6, pp. 293-294, (1963).

arg 1: 4 == n  [Number of elements to permute, n > 0]  default=4
   0:    [ . 1 2 3 ]     (0, 0)     [ . 1 2 3 ]
   1:    [ 1 . 2 3 ]     (1, 0)     [ 1 . 2 3 ]
   2:    [ 2 . 1 3 ]     (2, 0)     [ 1 2 . 3 ]
   3:    [ . 2 1 3 ]     (1, 0)     [ . 2 1 3 ]
   4:    [ 1 2 . 3 ]     (2, 0)     [ 2 . 1 3 ]
   5:    [ 2 1 . 3 ]     (1, 0)     [ 2 1 . 3 ]
   6:    [ 3 1 . 2 ]     (3, 0)     [ 2 1 3 . ]
   7:    [ 1 3 . 2 ]     (1, 0)     [ 2 . 3 1 ]
   8:    [ . 3 1 2 ]     (2, 0)     [ . 2 3 1 ]
   9:    [ 3 . 1 2 ]     (1, 0)     [ 1 2 3 . ]
  10:    [ 1 . 3 2 ]     (2, 0)     [ 1 . 3 2 ]
  11:    [ . 1 3 2 ]     (1, 0)     [ . 1 3 2 ]
  12:    [ . 2 3 1 ]     (3, 1)     [ . 3 1 2 ]
  13:    [ 2 . 3 1 ]     (1, 0)     [ 1 3 . 2 ]
  14:    [ 3 . 2 1 ]     (2, 0)     [ 1 3 2 . ]
  15:    [ . 3 2 1 ]     (1, 0)     [ . 3 2 1 ]
  16:    [ 2 3 . 1 ]     (2, 0)     [ 2 3 . 1 ]
  17:    [ 3 2 . 1 ]     (1, 0)     [ 2 3 1 . ]
  18:    [ 3 2 1 . ]     (3, 2)     [ 3 2 1 . ]
  19:    [ 2 3 1 . ]     (1, 0)     [ 3 2 . 1 ]
  20:    [ 1 3 2 . ]     (2, 0)     [ 3 . 2 1 ]
  21:    [ 3 1 2 . ]     (1, 0)     [ 3 1 2 . ]
  22:    [ 2 1 3 . ]     (2, 0)     [ 3 1 . 2 ]
  23:    [ 1 2 3 . ]     (1, 0)     [ 3 . 1 2 ]
 ct=24