2016-08-01 46 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)。