昨日の続き

def delete_min_comp a,x
  a_ = a.dup
  a_.sort!
  for i in 0 .. a_.size - 1
    if a_[i] > x
      a.delete_at(a.index(a_[i]))
      return a_[i]
    end
  end
  return nil
end

def ret_min_comp a,x
  a_ = a.dup
  a_.sort!
  for i in 0 .. a_.size - 1
    if a_[i] > x
      return a_[i]
    end
  end
  return nil
end

def next_permutation array
  a = array.dup
  t = []
  while a.length > 0
    t.push(a.pop)
    if(a.last == nil)
      break
    end
    if(ret_min_comp(t,a.last))
      k = delete_min_comp(t,a.last)
      t.push(a.pop)
      a.push(k)
      t.sort!
      break
    end
  end
  a += t
  return a
end

a = [1,2,3,4,5,6,7,8,9]
a_ = a.dup

begin
  p a
  a = next_permutation a
end while a_ != a

解説は後で!