2016-08-01 49 views
1

有一个著名的和最快的排列码没有任何“功能” VB .NET来重排列的数字只是几行,我不记得很遗憾。在VB NET最快排列码重排列编号

是否有任何人知道这个代码?或者像这样知道?

部分代码在这里:

更新:我找到了它。所有工作CODES HERE:

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 
+0

我想知道它,因为我创建一个太多,但有一个功能 –

回答

0

好像你正在寻找这...

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

...?

如果是,则IJ的起始值不正确(它们应分别为4和5,而不是3和4)。

(I知道示例使用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 
+0

是的,正是我要找的那个,而是由C++,我不知道写的,所以我不能把它转换到VB。互联网上有一个网页,在VB网上有这个代码。在该代码中,这些值已正确工作。代码可能不同。我需要VB NET中的代码。感谢您的帮助。 – Serhat

+0

行“虽然L [I - 1] ......”“我”有下划线并说:“括号标识缺少一个右]”也说同样的事情排“而L [J - 1]”为“J”。我用“]”关闭它,不起作用。我偶然用“()”,而不是再次工作。我使用VB .Net 2010,可能会有所作为。我真的不想再让你疲惫,但也许其他人可以使用这种快速代码。从心里感谢你。 – Serhat

+0

@Serhat AHHHHHH道歉道歉,我忘了,VB使用括号,而不是括号,现在编辑为你(我没有用VB几个月,我生锈) – 2016-08-01 16:08:26

0

对于获得一组的自然数的排列(推荐小于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)。