let next_perm a =
  let n = Array.length a in
  let i = ref (n - 2) in
  while !i >= 0 && a.(!i) >= a.(!i + 1) do
    i := !i - 1
  done;
  if !i < 0 then false
  else begin
    let j = ref (n - 1) in
    while a.(!j) <= a.(!i) do
      j := !j - 1
    done;
    let t = a.(!i) in a.(!i) <- a.(!j); a.(!j) <- t;
    let lo = ref (!i + 1) and hi = ref (n - 1) in
    while !lo < !hi do
      let t = a.(!lo) in a.(!lo) <- a.(!hi); a.(!hi) <- t;
      lo := !lo + 1;
      hi := !hi - 1
    done;
    true
  end

;;

let a = [| 1; 2; 3; 4; 5 |] in
let count = ref 0 in
while next_perm a do
  count := !count + 1
done;
!count
