Sortierung und Gruppierung per Binärer Suche

dignsag

Erfahrenes Mitglied
Folgendes Problem:

Ich habe eine Liste mit Vornamen in einer Textdatei! Jeder Vorname macht eine Zeile aus!
Nun möchte ich über eine Binäre Suche diese Liste sortieren und gleichzeitig gruppieren! Am besten so das ich immer eine Zeile einlese diese abspeichere in einem Array die nächste zeile einlese und schaue nun ob dieser vorname schon vorhanden ist! Ist er vorhanden dann soll der Vorname nicht im array gespeichert werden! Ist er nicht vorhanden soll er an der richtigen stelle (die liste soll ja am ende sortiert sein) eingefügt werden!
Kann mir jemand bei diesem Problem helfen?

Gruß Dignsag
 
Hier ist mal ein Ansatz von mir! Kann mir jemand sagen warum das nicht funktioniert?

Code:
Private Sub cmdSortGroup_Click()
 
 Dim sVorname As String
 Dim sSortedList() As String
 Dim nFreieDateiInput As Integer
 Dim nFreieDateiOutput As Integer
 Dim nMitte_AB As Integer
 Dim nMin_AB As Integer
 Dim nMax_AB As Integer
 Dim nSchleifenZaehler As Integer
 Dim nSchleifenZaehler2 As Integer
 Dim nZaehler As Integer
 Dim nMitteSpeicher As Integer
 Dim bGefunden As Boolean
 
 nFreieDateiInput = FreeFile()
 Open txtSpeichernVN For Input As #nFreieDateiInput
 		
 		Do While EOF(nFreieDateiInput) = False
 			nSchleifenZaehler = nSchleifenZaehler + 1
 			nSchleifenZaehler2 = 0
 			bGefunden = False
 
 			'lies einen Vornamen ein
 			Line Input #nFreieDateiInput, sVorname
 			ReDim Preserve sSortedList(nSchleifenZaehler)
 
 			nMin_AB = 0
 			nMax_AB = UBound(sSortedList)
 
 			Do While bGefunden = False
 			    nSchleifenZaehler2 = nSchleifenZaehler2 + 1
 
 			    nMitte_AB = ((nMax_AB - nMin_AB) / 2) + nMin_AB
 				nMitte_AB = Int(nMitte_AB)
 
 			    ' Wenn der Vorname in der Datei schon vorhanden ist
 			    '   dann schreib ihn nicht in die Datei
 			    If sVorname = sSortedList(nMitte_AB) Then
 				    bGefunden = True
 			    ElseIf sVorname > sSortedList(nMitte_AB) Then
 				    nMin_AB = nMitte_AB
 				Else
 				    nMax_AB = nMitte_AB
 				End If
 
 			    '   ansonsten ordne ihn der Datei richtig zu
 			    If Int((nMax_AB - nMin_AB) / 2) = 0 Then
 				    sSortedList(nSchleifenZaehler) = sVorname
 				    If sVorname > sSortedList(nMitte_AB) Then
 					    For nZaehler = 1 To UBound(sSortedList) - nMitte_AB
 						    tauschen sSortedList(UBound(sSortedList)), sSortedList(nMitte_AB + nZaehler)
 					    Next
 					    Exit Do
 					Else
 					    For nZaehler = 0 To UBound(sSortedList) - nMitte_AB
 						    tauschen sSortedList(UBound(sSortedList)), sSortedList(nMitte_AB + nZaehler)
 					    Next
 					    Exit Do
 					End If
 				End If
 
 			Loop
 		Loop
 
 Close #nFreieDateiInput
 
 nFreieDateiOutput = FreeFile()
 Open txtSGVornamen For Output As #nFreieDateiOutput
 
 	For nSchleifenZaehler = 1 To UBound(sSortedList)
 		If sSortedList(nSchleifenZaehler) <> "" Then
 			Print #nFreieDateiOutput, sSortedList(nSchleifenZaehler)
 		End If
 	Next
 
 Close #nFreieDateiOutput
 
 End Sub
 
Ups, sorry

hast natürlich recht!

Code:
Public Sub tauschen(String1 as String, String2 as String)
 
Dim merken as String
 
merken = String1
String1 = String2
String2 = merken
 
End Sub
 
Hi dignsag,

dein Problem ist, daß du dein Array auch erweiterst, wenn der Name schon in der Liste vorhanden ist. Durch dieses Leerfeld wird der Sortiervorgang gestört.

Das Ziel ist also, deinen Schleifenzähler wieder zu reduzieren, wenn kein neues Element in die Liste aufgenommen wird.

Hier ist nochmal ein kleiner Code-Ausschnitt, in dem ich die Änderungen vorgenommen habe.
Code:
		If Int((nMax_AB - nMin_AB) / 2) = 0 Then
			sSortedList(nSchleifenZaehler) = sVorname
			If sVorname > sSortedList(nMitte_AB) Then
				For nZaehler = 1 To UBound(sSortedList) - nMitte_AB
					tauschen sSortedList(UBound(sSortedList)), sSortedList(nMitte_AB + nZaehler)
				Next
				Exit Do
			Else
				For nZaehler = 0 To UBound(sSortedList) - nMitte_AB
					tauschen sSortedList(UBound(sSortedList)), sSortedList(nMitte_AB + nZaehler)
				Next
				Exit Do
			End If
		End If
	Loop
	If bGefunden = True Then
		nSchleifenZaehler = nSchleifenZaehler - 1
	End If
Loop
 
Stimmt das war das Problem, vielen vielen Dank! Hab mich damit jetzt schon etliche Tage rumgeschlagen und bin nicht drauf gekommen!
 
Zurück