62 lines
1.5 KiB
Text
62 lines
1.5 KiB
Text
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."
|