Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
996to1000
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

Zahlenwerte mit QuickSort in Spalte sortieren

Zahlenwerte mit QuickSort in Spalte sortieren
31.07.2008 12:17:05
Timo
Hallo Ihr.
Ich habe ein etwas größeres Problem, welches ich mit meinen VBA- Kenntnissen nicht lösen konnte.
In meinem Tabelleblatt habe ich 8760 Zahlenwerte, ausgehend von AA22 bis AA8780 stehen. Diese Zahlenwerte möchte ich nun in die Spalte AB22:AB8780 kopieren und dort sollen sie dann der Größe nach geordnet werden. In AB22 soll der größte Zahlenwert und in AB8780 der kleinste Zahlenwert stehen.
Mit Hilfe des Makrorekorders hatte ich mir schon einen Code programmiert, der auch sehr gut funktionierte. Nun wollte ich es mal mit dem QuickSort- Algorithmus probieren, komme aber auf keinen grünen Zweig. Kann mir jemand den korrekten Code dafür zeigen?

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Zahlenwerte mit QuickSort in Spalte sortieren
31.07.2008 12:30:00
Tobias
Hallo Timo!
Quicksort ist bei mir schon ein 2-3 Semester her. Ich hatte damals auch einen Quicksort für VBA programmiert. Leider nicht dokumentiert und mit saumäßigen Parameterübergaben versehen. Vielleicht hilft es Dir weiter.
Schönen Gruß, Tobi
http://www.tobiasschmid.de/


Call Quicksort(Data, 1, UBound(Data))




Private Function Quicksort(Data, links, rechts)
Dim Teiler As Long
If rechts > links Then
    Teiler = Teile(Data, links, rechts)
    Call Quicksort(Data, links, Teiler - 1)
    Call Quicksort(Data, Teiler + 1, rechts)
End If
End Function




Private Function Teile(Data, links, rechts)
Dim Index As Long
Dim i As Long
Index = links
For i = links To rechts - 1
    If Data(i) <= Data(rechts) Then
        Call Tausche(Data, Index, i)
        Index = Index + 1
    End If
Next
Call Tausche(Data, Index, rechts)
Teile = Index
End Function




Private Sub Tausche(Data, i, j)
Dim Temp As Double
Temp = Data(i)
Data(i) = Data(j)
Data(j) = Temp
End Sub


Anzeige
falls der Code funktioniert...
31.07.2008 12:34:00
Tobias
...wäre ein Feedback sehr schön. Dann könnte ich den Code wieder in meine Codesammlung aufnehmen.
Schönen Gruß, Tobias
http://www.tobiasschmid.de/

AW: falls der Code funktioniert...
31.07.2008 12:47:00
Timo
Ist jetzt bestimmt eine verdammt dumme Frage, aber wie passe ich diesen Code auf mein Bedürfnisse an? Also wie sage ich Excel, dass ich den Bereich AB22:AB8781 ordnen will?

AW: falls der Code funktioniert...
31.07.2008 13:03:00
Tobias
Upps. Ja, das stimmt. Der Code sortiert ein Array und keine Zellen. Probier's mal hiermit:


Option Explicit
Private Daten() As Double
Private rng As Range
Sub Einlesen()
    Dim i As Long
    Set rng = Range("A1:A100")
    ReDim Daten(rng.Rows.Count)
    For i = 1 To UBound(Daten)
        Daten(i) = rng(i, 1).Value
    Next
    Call Quicksort(Daten, 1, UBound(Daten))
    Auslesen
End Sub
Sub Auslesen()
    Dim i As Long
    For i = 1 To UBound(Daten)
        rng(i, 1) = Daten(i)
    Next
End Sub


Schönen Gruß, Tobias
http://www.tobiasschmid.de/

Anzeige
AW: falls der Code funktioniert...
31.07.2008 13:36:36
Timo
Bin irgendwie komplett auf Off. Könntest du mir bitte mal den gesamten, auf meine Bedürfnisse zugeschnittenen, Code posten? Bitte?

AW: falls der Code funktioniert...
31.07.2008 14:03:26
Tobias
Hallo Timo!
Mit diesem Code sollte es klappen. Die Dokumentation ist aber immer noch sehr dürftig.
Hinweis:
Es kann passieren, dass das Programm mit der Meldung "zu wenig Speicher" abbricht. Problem ist, das Quicksort ein rekursiver Sortieralgorithmus ist und unter ungünstigen Bedingungen zu viele Rekursionen notwendig werden um die Liste zu sortieren. Siehe hierzu auch Wikipedia. http://de.wikipedia.org/wiki/Quicksort

Im ungünstigsten Fall ist die Anzahl der Rekursionen nur durch die Listenlänge n beschränkt,  _
was einen
Stapel der Größe \mathcal{O}(n ) erfordert. Dies kann bei langen Listen zu einem Stapelüberlauf  _
führen. Es
gibt vielfältige Modifikationen des Algorithmus um dieses Problem zu lösen bzw. die  _
Wahrscheinlichkeit des
Auftretens zu vermindern[2]:
* Endrekursionsbeseitigung (siehe nachfolgenden Pseudocode)
* eine ausgewogenere Wahl des Pivotelements (Median von Drei)
* Wahl eines zufälligen Pivotelements, was systematische Probleme durch die ursprüngliche  _
Anordnung der Elemente vermeidet
* Vermeidung von Teilisten mit weniger als zwei Elementen (ergibt, wenn auch das  _
Pivotelement aus den Teillisten genommen wird, die maximale Rekursionstiefe n / 3)




Option Explicit
Private Daten() As Double
Private rng As Range
Sub Main()
    'Daten aus den Zellen AA22 bis AA8780 in das Datenfeld Daten kopieren
    Set rng = Range("AA22:AA8780")
    Einlesen
    'Daten mit Quicksort sortieren
    Call Quicksort(Daten, 1, UBound(Daten))
    'Daten wieder ins Excel-Sheet zurückschreiben
    Set rng = Range("AB22:AB8780")
    Auslesen
    'Kurze Meldung wenn fertig
    Debug.Print "fertig"
End Sub
Private Sub Einlesen()
    Dim i As Long
    ReDim Daten(rng.Rows.Count)
    'Zelleninhalte schnellstmöglich nach VBA lesen
    For i = 1 To UBound(Daten)
        Daten(i) = rng(i, 1)
    Next
End Sub
Private Sub Auslesen()
    Dim i As Long
    Dim var As Variant
    'VBA-Daten schnellstmöglich in Zellen schreiben
    var = rng
    For i = 1 To UBound(Daten)
        var(i, 1) = Daten(i)
    Next
    rng = var
End Sub
Private Function Quicksort(Data, links, rechts)
    Dim Teiler As Long
    If rechts > links Then
        Teiler = Teile(Data, links, rechts)
        Call Quicksort(Data, links, Teiler - 1)
        Call Quicksort(Data, Teiler + 1, rechts)
    End If
End Function
Private Function Teile(Data, links, rechts)
    Dim Index As Long
    Dim i As Long
    Index = links
    For i = links To rechts - 1
        If Data(i) <= Data(rechts) Then
            Call Tausche(Data, Index, i)
            Index = Index + 1
        End If
    Next
    Call Tausche(Data, Index, rechts)
    Teile = Index
End Function
Private Sub Tausche(Data, i, j)
    Dim Temp As Double
    Temp = Data(i)
    Data(i) = Data(j)
    Data(j) = Temp
End Sub


Ich hoffe, ich konnte Dir helfen, Tobi
http://www.tobiasschmid.de/

Anzeige
AW: falls der Code funktioniert...
31.07.2008 14:12:00
Timo
Es geht! Es geht!
Danke dir vielmals. Werde mir den Code jetzt mal bei ner schönen Tasse Kaffee anschauen.

AW: Zahlenwerte mit QuickSort in Spalte sortieren
31.07.2008 16:06:00
ioannis
Hallo,
eine andere Moeglichkeit ohne VBA waere:
In AB22-> KGROESSTE(AA$22:AA$8780;AC22) nach unten kopieren...
In AC22-> 1 nach unten kopieren...
Freundliche Gruesse
Ioannis

318 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige