VB NET 中最快的排列码排列数

The Fastest Permutation Code Permutating Numbers in VB NET

对于 VB .Net 有一个著名且最快的排列代码,没有任何 "function" 来排列几行中的数字,不幸的是我不记得了。

有人知道这段代码吗?或者是这样认识的?

部分代码在这里:

更新:我找到了。这里的所有工作代码:

Dim L(4) As Byte
Dim I As Byte
Dim K As Byte
Dim J As Byte
Dim RESULTS As String
Dim UB, UBm1 As Integer

L = {1, 2, 3, 4, 5}

UB = L.GetUpperBound(0)
UBm1 = UB - 1

Do
    I = UBm1
    Do While I > 0 And L(I) >= L(I + 1)
        I -= 1
    Loop
    K = L(I)
    J = UB
    Do While J > 0 And L(J) <= K
        J -= 1
    Loop

    RESULTS = L(0) & "," & L(1) & "," & L(2) & "," & L(3) & "," & L(4)

    L(I) = L(J)
    L(J) = K
    Array.Reverse(L, I + 1, UB - I)

Loop While J

你好像在找这个...

http://www.cut-the-knot.org/do_you_know/AllPerm.shtml (2. 字典顺序和寻找下一个排列)

... ?

以防万一,IJ 的起始值不正确(它们应该分别是 4 和 5 而不是 3 和 4)。

(我知道该示例使用 swap,但可以将其替换为单个冒号分隔行。)

Dim L(4) As Byte
L = {1, 2, 3, 4, 5}

Dim K as Byte

For N as integer = 1 to 120 'No. of permutations: 5!
    Dim I As Byte = 4, J as Byte = 5

    While L(I - 1) >= L(I)
        I -= 1   
    End While
    While L(J - 1) <= L(I - 1)
        J -= 1
    End While

    K = L(I - 1) : L(I - 1) = L(J - 1) : L(J - 1) = K
    I += 1 : J = 5
    While I < J
        K = L(I - 1) : L(I - 1) = L(J - 1) : L(J - 1) = K
        I += 1 : J -= 1
    End While

    Dim RESULT as String = L(0) & "," & L(1) & "," & L(2) & "," & L(3) & "," & L(4)
    'Export / print RESULT as you like, e.g. Console.WriteLine or something
Next

为了得到一个自然数的一组排列(推荐小于10,虽然它可以大于10),这个VBA Excel 子程序非常快速和简短。我相信将它转换为 VB.NET 会很容易。看看。

Const P = 5                                     'Recommended Max P = 9
Dim m As Long, PArray(1 To 1000, 1 To P)        'Recommended Max 9! = 362880

Public Sub PermutationNaturalNumber()
    Dim Q(1 To P) As Long
    For m = 1 To P: Q(m) = m: Next: m = 0
    PermutationGenerator P, Q
    Range("A1").Resize(UBound(PArray), P) = PArray: End
End Sub

Sub PermutationGenerator(n As Long, Q() As Long)
    Dim i As Long, j As Long, k As Long
    If n > 1 Then
        For i = 1 To n - 1
            PermutationGenerator n - 1, Q
            If n Mod 2 = 1 Then j = 1 Else j = i
            k = Q(j): Q(j) = Q(n): Q(n) = k
        Next
        PermutationGenerator n - 1, Q
    Else
        m = m + 1: For i = 1 To P: PArray(m, i) = Q(i): Next
    End If
End Sub

P 可以是任何自然数,在本例中为 {1, 2, 3, 4, 5}。确保用 P 更改 PArray 的上限!意思是 (P*(P-1)*(P-2)*...*1).