Hallo zusammen,
ich habe versucht Mergesort in Visual Basic zu programmieren, habe den Algorithmus soweit verstanden, nur scheitere ich an der Umsetzung in VB. (Programmiere noch nicht all zu lange )
Der rekursive Teil, in dem der Array bis zur Listenlänge von 1 aufgeteilt wird, funktioniert. Das Problem besteht in dem "merging" der einzelnen kleinen Listen..als Ausgabe erhalte ich ausschließlich Nullen.
Mein Code sieht so aus:
Über Hilfe jeglicher Art wäre ich sehr glücklich.
Levyce
ich habe versucht Mergesort in Visual Basic zu programmieren, habe den Algorithmus soweit verstanden, nur scheitere ich an der Umsetzung in VB. (Programmiere noch nicht all zu lange )
Der rekursive Teil, in dem der Array bis zur Listenlänge von 1 aufgeteilt wird, funktioniert. Das Problem besteht in dem "merging" der einzelnen kleinen Listen..als Ausgabe erhalte ich ausschließlich Nullen.
Mein Code sieht so aus:
Visual Basic-Quellcode
-
- Public Class Form1
- Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
- Dim testA(8), output(8) As Integer
- testA(1) = 2
- testA(2) = 3
- testA(3) = 4
- testA(4) = 5 'Testarray
- testA(5) = 1
- testA(6) = 6
- testA(7) = 7
- testA(8) = 8
- output = Mergesort(testA)
- For i = 1 To testA.Length - 1
- ListBox1.Items.Add(output(i)) 'Ausgabe in Listbox
- Next
- End Sub
- Private Function Mergesort(ByVal m As Array) As Integer()
- Dim leftA((m.Length - 1) / 2), rightA((m.Length - 1) / 2) As Integer
- If m.Length - 1 <= 1 Then
- Return m 'Abbruch bei Listenlänge von 1
- Else
- For i = 1 To (m.Length - 1) / 2
- leftA(i) = m(i) 'Aufteilung des Arrays in linke (& rechte Liste)
- Next
- For i = (m.Length - 1) / 2 + 1 To m.Length - 1 'Aufteilung des Arrays in linke (& rechte Liste)
- rightA(i - ((m.Length - 1) / 2)) = m(i)
- Next
- leftA = Mergesort(leftA) 'Selbstaufruf bis Arraylänge = 1
- rightA = Mergesort(rightA)
- Return merge(leftA, rightA)
- End If
- End Function
- Private Function merge(ByVal x As Array, ByVal y As Array) As Integer()
- Dim leftA(x.Length - 1) As Integer
- Dim rightA(y.Length - 1) As Integer
- Dim sortedA(8) As Integer
- Dim pos As Integer = 1
- leftA = x
- rightA = y
- While leftA.Length - 1 > 0 And rightA.Length - 1 > 0 'Bei Arraylänge ab 1
- If leftA(1) <= rightA(1) Then 'wird sortiert (per "merging"),
- sortedA(pos) = leftA(1) 'der kleinere Wert in das neue Array hinzugefügt
- Dim tempArray(leftA.Length - 2) As Integer
- For i = 1 To leftA.Length - 2 'und aus dem vorherigen Array gelöscht und dieser wird "aufgeschoben"
- tempArray(i) = leftA(i + 1)
- Next
- ReDim Preserve leftA(leftA.Length - 2)
- leftA = tempArray
- Else
- sortedA(pos) = rightA(1) 'Else für den Fall, dass die andere Zahl kleiner ist
- End If
- pos += 1 'pos nimmt Werte an, die außerhalb der Arraylänge liegen, wieso? :s
- End While
- If leftA.Length - 1 > 0 Then '|
- For i = 1 To leftA.Length - 1 '|
- sortedA(pos) = leftA(i) '|
- Next '| Rest wird dem neuen Array hinzugefügt
- ElseIf rightA.Length - 1 > 0 Then '|
- For i = 1 To rightA.Length - 1 '|
- sortedA(pos) = rightA(i) '|
- Next
- End If
- pos += 1
- Return sortedA
- End Function
- End Class
Über Hilfe jeglicher Art wäre ich sehr glücklich.
Levyce