Function factorial(n As Integer) As Uinteger Return Iif(n = 0, 1, n * factorial(n - 1)) End Function Sub swap_(s As String, i As Integer, j As Integer) Dim As String temp = Mid(s, i, 1) Mid(s, i, 1) = Mid(s, j, 1) Mid(s, j, 1) = temp End Sub Sub permute(s As String, l As Integer, r As Integer, perms() As String) If l = r Then Redim Preserve perms(Ubound(perms) + 1) perms(Ubound(perms)) = s Else For i As Uinteger = l To r swap_(s, l, i) permute(s, l + 1, r, perms()) swap_(s, l, i) ' backtrack Next i End If End Sub Sub bubbleSort(arr() As String) Dim As Integer i, j, n = Ubound(arr) Dim As String temp For i = 0 To n - 1 For j = 0 To n - i - 1 If arr(j) > arr(j + 1) Then temp = arr(j) arr(j) = arr(j + 1) arr(j + 1) = temp End If Next j Next i End Sub Function nextHigh1(Byref n As String) As String Dim As String perms() Dim As Uinteger i, idx permute(n, 1, Len(n), perms()) bubbleSort perms() Dim As Uinteger k = Ubound(perms) For i = 0 To k If perms(i) = n Then idx = i Exit For End If Next i Return Iif(idx < k, perms(idx + 1), "0") End Function Dim As String tests1(7) = {"0", "9", "12", "21", "12453", "738440", "45072010", "95322020"} Dim As Double t0 = Timer For i As Uinteger = 0 To Ubound(tests1) Print tests1(i); " => "; nextHigh1(tests1(i)) Next i Print Chr(10); Timer - t0; "sec."