オブジェクト指向ならあんな書き方しねえよ、ということで修正。Arrayに対してメソッドを追加する方法で。

class Array
  def deletemin_comp x
    a = self.dup
    a.sort!
    for i in 0 .. a.size - 1
      if a[i] > x
        self.delete_at(self.index(a[i]))
        return a[i]
      end
    end
    return nil
  end
  
  def returnmin_comp x
    a = self.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
    a = self.dup
    t = []
    while a.length > 0
      t.push(a.pop)
      if(a.last == nil)
        break
      end
      if(t.returnmin_comp(a.last))
        k = t.deletemin_comp(a.last)
        t.push(a.pop)
        a.push(k)
        t.sort!
        break
      end
    end
    a += t
    return a
  end 
end

a = [1,2,3]
a_ = a.dup

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