Anzeige
Archiv - Navigation
1320to1324
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Array - BubbleSort

Array - BubbleSort
19.07.2013 13:18:42
Seb
Hallo Leute,
ich habe hier ein Problem, welches ich mir einfach nicht erklären kann.
Folgendes:
Ich hole mir Daten aus eines Access-DB,
den String zerlege ich in einer bestimmten Art,
so dass ich nen Array habe, welches nur Zahlen enthält.
Mit CInt schreibe ich diese dann in ein neues Array,
welches ich mir mit dem bubblesort-alg. sortieren lassen möchte.
Allerdings gibt er mir die Zahlen wie folgt:
1
1
10
11
12
15
2
3
4
5
also als wenn CInt nicht funktionieren würde, aber der Arraytyp ist: Variant/Integer
hier mal der code:

arrTest = rs.GetRows
For Each strWert In arrTest
strArray = Split(strWert, ".")
i = UBound(strArray)
no0 = strArray(i - 2)
no1 = strArray(i - 1)
no2 = strArray(i)
If IsNumeric(no0) = True Then
new_nr = no0
ElseIf IsNumeric(no1) = True Then
new_nr = no1
Else
new_nr = no2
End If
new_nr = CInt(new_nr) 'String -> Integer change
If IsEmpty(sortArray) Then
sortArray = Array(new_nr)
Else
ReDim Preserve sortArray(UBound(sortArray) + 1)
sortArray(UBound(sortArray)) = new_nr
End If
Next strWert
'Bubblesort
For z = UBound(sortArray) - 1 To LBound(sortArray) Step -1
For y = LBound(sortArray) To z
If LCase(sortArray(y)) > LCase(sortArray(y + 1)) Then
intWert = sortArray(y)
sortArray(y) = sortArray(y + 1)
sortArray(y + 1) = intWert
End If
Next y
Next z

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Probiere es mal mit QuickSort
19.07.2013 13:45:27
Martin
Hallo Seb,
versuch es mit dem Quicksort-Algorithmus, der ist (zumindest bei größeren Datenmengen) ohnehin schneller:
'Quicksort mit mehreren Sortierkriterien
'  Parameter:  arrK = Sortkey(s)
'              arrD = zu sortierendes Array
'  Ist die Zahl positiv, wird aufsteigend, sonst absteigend sortiert.
Public Sub prcSort(ArrK As Variant, arrD() As Variant)
Dim iiK As Integer, nnB As Long, nnC As Long, nArrZ() As Long
Dim nnZ As Long, nnA As Long, vntTemp As Variant
ReDim nArrZ(0 To 1, 0 To UBound(arrD) * 2)
nArrZ(0, 0) = LBound(arrD)                ' Array für den 1. Sortierlauf
nArrZ(0, 1) = UBound(arrD)
nnZ = 1
For iiK = LBound(ArrK) To UBound(ArrK)
If ArrK(iiK)  0 Then                 ' Wenn eine Spalte angegeben
nnA = -1
For nnB = 0 To nnZ Step 2           ' Schleife zum sortieren der Bereiche
If nArrZ(0, nnB)  nArrZ(0, nnB + 1) Then   ' Sortieren, wenn Zeilenzahl > 1
Call prcQSort(CLng(nArrZ(0, nnB)), _
CLng(nArrZ(0, nnB + 1)), CInt(Abs(ArrK(iiK))), _
CBool(ArrK(iiK) > 0), arrD())
nnA = nnA + 2                       ' sortierten Bereich merken
nArrZ(1, nnA - 1) = nArrZ(0, nnB)
nArrZ(1, nnA) = nArrZ(0, nnB + 1)
End If
Next
nnZ = -1
For nnB = 0 To nnA Step 2  'Durchsuchen der sortierten Spalte nach Wertewechsel
vntTemp = arrD(nArrZ(1, nnB), Abs(ArrK(iiK))) '1. Zeile des zu sort. Bereichs
nnZ = nnZ + 1
nArrZ(0, nnZ) = nArrZ(1, nnB)
For nnC = nArrZ(1, nnB) To nArrZ(1, nnB + 1)  ' Suche nach Wechsel im Bereich
If vntTemp  arrD(nnC, Abs(ArrK(iiK))) Then
nnZ = nnZ + 2
nArrZ(0, nnZ - 1) = nnC - 1
nArrZ(0, nnZ) = nnC
vntTemp = arrD(nnC, Abs(ArrK(iiK)))
End If
Next
nnZ = nnZ + 1                                 ' letzte Zeile im Bereich
nArrZ(0, nnZ) = nArrZ(1, nnB + 1)
Next nnB
End If
Next iiK
End Sub
Private Sub prcQSort(lngLB As Long, lngUB As Long, iiZ As Integer, _
bAufAb As Boolean, arrD())
Dim iiK As Integer, nnB As Long, nnC As Long, vntTemp As Variant, vntBuffer As Variant
nnB = lngLB
nnC = lngUB
vntBuffer = arrD((lngLB + lngUB) \ 2, iiZ)
Do
If bAufAb Then
Do While arrD(nnB, iiZ)  vntBuffer: nnB = nnB + 1: Loop
Do While vntBuffer > arrD(nnC, iiZ): nnC = nnC - 1: Loop
End If
If nnB  arrD(nnC, iiZ) Then
For iiK = LBound(arrD, 2) To UBound(arrD, 2)
vntTemp = arrD(nnB, iiK)
arrD(nnB, iiK) = arrD(nnC, iiK)
arrD(nnC, iiK) = vntTemp
Next
End If
nnB = nnB + 1
nnC = nnC - 1
ElseIf nnB = nnC Then
nnB = nnB + 1
nnC = nnC - 1
End If
Loop Until nnB > nnC
If lngLB 
Viele Grüße
Martin

Anzeige
AW: Array - BubbleSort
19.07.2013 13:46:56
Rudi
Hallo,
LCase erzeugt einen String.
Gruß
Rudi

Wieso LCASE() ? - Das ist eine STRING-Operation !
19.07.2013 13:50:55
NoNet
Hallo Seb,
mit LCASE(sortArray(y)) behandelst Du den Wert wiederum als STRING !
Also : LCASE(1) = "1", LCASE(11) = "11" und LCASE(2) = "2"
Demnach wird alles STRING-mäßig sortiert, also "1" < "11" < "2" !!
Verwende CINT() anstelle LCASE() oder lasse das LCASE() einfach weg !
Gruß, NoNet
Hast Du Interesse, andere Excel-Begeisterte kennenzulernen ? - Dann komme zum
Exceltreffen 11.-13.10.2013 in Duisburg

http://www.exceltreffen.de/index.php?page=230
Anmeldungen sind noch bis 31.07.2013 möglich ! - Schau doch mal rein !

Anzeige
AW: Wieso LCASE() ? - Das ist eine STRING-Operation !
19.07.2013 14:06:25
Seb
jup das war es!
kommt davon wenn man einfach sachen kopiert ohne sie nachzuhalten!
VIELEN DANK,
schönes WE !

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige