Hackerboard WikiHaboWeb Linkverzeichnis

[HaBo]

major security
 
Code Kitchen Allgemeines Coder-Forum rund um das Programmieren eigenständiger, ausführbarer Programme.

Quicksort

Diskussion: Quicksort im Forum Code Kitchen, in der Kategorie Software Home; Erstmal Hallo alle zusammen. Ziemliches Anfängerproblem gerade bei mir.... Ich habe mich schon vor einiger Zeit mal mit Quicksort beschäftigt. ...

Antwort
Alt 09.03.09, 17:26   #1 (permalink)
 
Registriert seit: 09.03.09
Karma: 3
Burgess Leistung: Facit NTK
Standard Quicksort


Erstmal Hallo alle zusammen.

Ziemliches Anfängerproblem gerade bei mir....
Ich habe mich schon vor einiger Zeit mal mit Quicksort beschäftigt. Dabei hatte ich eigentlich auch angenommen das Ganze verstanden zu haben, allerdings stoße ich gerade wieder darauf und bin etwas verwirrt.

Grundlegend steht auf dieser Seite (Hier), dem zugehörigen Wikipedia Artikel und auch in einem Buch das ich besitze folgendes:

Zitat:
Zunächst wird die zu sortierende Liste in zwei Teillisten ("linke" und "rechte" Teilliste) getrennt. Dazu wählt Quicksort ein sogenanntes Pivotelement aus der Liste aus. Alle Elemente, die kleiner als das Pivotelement sind, kommen in die linke Teilliste, und alle, die größer sind, in die rechte Teilliste.
Als ich mich das Erste mal mit Quicksort befasst habe war dort immer das mittlere Element im Array als Pivot gewählt worden. Wobei mir grundsätzlich bekannt ist/war, dass theoretisch jedes Element genommen werden kann.

Jetzt bin ich aber im Internet schon öfter auf Implementierungen von Quicksort gestoßen, die zwar funktionieren, diese Aussage allerdings nicht 100% umsetzen.

Beispiel ist hier ein Perl Algorithmus, der auch auf der oben genannten Seite unter den Implementierungen zu finden ist. (Hier)

Code:
sub quicksort {
    my ( $aref , $links , $rechts , $compare ) = @_;

    my ($l,$r,$pivot) = (
        $links,$rechts,
        $aref->[ int +($links+$rechts) / 2 ]
    );

    while( $l <= $r ){

        $l++ while $compare->( $aref->[$l], $pivot      ) == -1;
        $r-- while $compare->( $pivot     , $aref->[$r] ) == -1;

        if ( $l <= $r ) {

              @{$aref}[$l,$r] = @{$aref}[$r,$l];
              $l++;$r--;

        }
    }

    quicksort( $aref, $links, $r,  $compare) if $links < $r;
    quicksort( $aref, $l, $rechts, $compare) if $l < $rechts;
}
Ich hätte auch noch andere Implementierung die wie diese arbeiten.
Wählt man als Eingabedaten mal diese Zahlen:
my @ar = qw/26 55 24 93 16 27 89 67 49 90 56/;
und lässt sich vor dem ersten Rekursiven Aufruf das Array ausgeben, stehen die Elemente nicht wie es sein sollte rechts und links vom Pivot (je nach Größe).
Die Ausgabe wird sein: 26 27 24 16 93 55 89 67 49 90 56 bei Pivot 27

So wie obiger Ablauf war auch der erste Quicksort, mit dem ich Kontakt hatte. Deswegen bin ich jetzt relativ verwundert, dass die Standardimplementierung und Logik wohl anders arbeitet.

Was genau hat es damit auf sich?

Danke schonmal.
Burgess ist offline  
Digg this Post!Add Post to del.icio.usBookmark Post in Technorati
Mit Zitat antworten
Alt 09.03.09, 18:28   #2 (permalink)
Moderator
 
Benutzerbild von Elderan
 
Registriert seit: 30.03.04
Karma: 64
Elderan Leistung: OpteronElderan Leistung: OpteronElderan Leistung: OpteronElderan Leistung: OpteronElderan Leistung: Opteron
Standard

Hallo,
wenn 27 wirklich das Pivot Element ist, dann wäre
26 27 24 16 93 55 89 67 49 90 56

eindeutig falsch sortiert.
Elderan ist offline  
Digg this Post!Add Post to del.icio.usBookmark Post in Technorati
Mit Zitat antworten
Alt 09.03.09, 18:34   #3 (permalink)
Themenstarter
 
Registriert seit: 09.03.09
Karma: 3
Burgess Leistung: Facit NTK
Standard

Also bevor das erste mal die Rekursion aufgerufen wird hat das Array diese Form. Ganz am Ende ist logischerweise alles passend sortiert.
Burgess ist offline  
Digg this Post!Add Post to del.icio.usBookmark Post in Technorati
Mit Zitat antworten
Alt 10.03.09, 12:22   #4 (permalink)
Moderator
 
Benutzerbild von Elderan
 
Registriert seit: 30.03.04
Karma: 64
Elderan Leistung: OpteronElderan Leistung: OpteronElderan Leistung: OpteronElderan Leistung: OpteronElderan Leistung: Opteron
Standard

Hallo,
da ich mit Perl nicht so vertraut bin, poste ich mal einfach ein Link zu einem guten Artikel über Quicksort:
http://www.linux-related.de/index.ht...sort_quick.htm
Elderan ist offline  
Digg this Post!Add Post to del.icio.usBookmark Post in Technorati
Mit Zitat antworten
Alt 10.03.09, 15:57   #5 (permalink)
Themenstarter
 
Registriert seit: 09.03.09
Karma: 3
Burgess Leistung: Facit NTK
Standard

Ja die Beschreibung ist gut und spiegelt auch das was ich in einem Buch und unter oben genannten Link gelesen habe.
Allerdings erst jetzt. Vor ca. einem Jahr als ich das erste mal Kontakt zu Quicksort hatte, hatte ich nur eine Visual Basic Implementierung, die so vorging wie das Perl Skript oben.
Ich bin jetzt eben extrem darüber verwundert, dass diese Implementierungen die Grundlogik von Quicksort nicht unbedingt befolgen, aber trotzdem zu einem passenden Ergebnis kommen. (Und eben auch als Quicksort verkauft werden^^)

Ist die Implementierung, bei der das Pivot nicht genau genau zwischen den größeren und kleineren Elementen steht, denn eine Optimierung des Algorithmus, oder was hat es mit diesem Unterschied auf sich?

Ich poste auch mal den VB Code (sorry.. ist eine etwas unnötig lange Version):

Code:
Private Function QSort(feld, Optional ByVal l As Integer = 0, Optional ByVal r2 As Integer = 0)
    Dim r, x, i, j As Integer
    Dim auslager
    
    If r2 = 0 Then
        r = UBound(feld)
    Else
        r = r2
    End If
    
    i = l
    j = r
    x = feld((j + i) / 2)
    
    Do
        Do
            If feld(i) < x Then
                i = i + 1
            Else
                Exit Do
            End If
        Loop
        Do
            If x < feld(j) Then
                j = j - 1
            Else
                Exit Do
            End If
        Loop
        If i <= j Then
            auslager = feld(i)
            feld(i) = feld(j)
            feld(j) = auslager
            i = i + 1
            j = j - 1
        End If
    Loop Until i > j
    
    If l < j Then QSort feld, l, j
    If i < r Then QSort feld, i, r
End Function
Burgess ist offline  
Digg this Post!Add Post to del.icio.usBookmark Post in Technorati
Mit Zitat antworten
Alt 10.03.09, 17:57   #6 (permalink)
 
Registriert seit: 16.05.08
Karma: 5
Binäru$ Leistung: Facit NTK
Standard RE: Quicksort

Zitat:
Original von Burgess


Ich hätte auch noch andere Implementierung die wie diese arbeiten.
Wählt man als Eingabedaten mal diese Zahlen:
my @ar = qw/26 55 24 93 16 27 89 67 49 90 56/;
und lässt sich vor dem ersten Rekursiven Aufruf das Array ausgeben, stehen die Elemente nicht wie es sein sollte rechts und links vom Pivot (je nach Größe).
Die Ausgabe wird sein: 26 27 24 16 93 55 89 67 49 90 56 bei Pivot 27
Hi,

Deine Ausgabe ist afaik korrekt.
Wie du schon beschrieben hast, sind alle Elemente kleiner (bzw gleich, je nach Anordnung der Elemente) dem Pivotelement in der linke Teilliste und Elemente welche größer sind, befinden sich in der rechten Teilliste. Diese Ausage trifft bei dem Perl bzw VB Code zu.

Wobei man natürlich auch die rechte Teilmenge mit Elementen >= Pivotelement und die linke mit Elementen < Pivotelement füllen kann.

Schritt für Schritt:
Code:
array = 26 55 24 93 16 27 89 67 49 90 56;             => pivotelement= 27
linker Teil = 26 27 24 16                      
Also alle Elmente sind <= den Pivotelement


array = 26 27 24 16                                                 => pivotelement = 27
linker Teil = 26 24 16
In diesem Fall sind alle Elemente < Pivotelement im linken Teil.


array = 26 24 16                                                     => pivotelement = 16
linker Teil = 16
=> Sortiert
usw...
Je nachdem wie die Elemente im Array vorliegen, ist der linke Teil < oder <= Pivotelement.

Außerdem wird vorallem bei großen Arrays das Pivotelement errechnet zb.:
(array[0]+array[arraylänge/2]+array[arraylänge-1])/3.
Binäru$ ist offline  
Digg this Post!Add Post to del.icio.usBookmark Post in Technorati
Mit Zitat antworten
Alt 11.03.09, 18:24   #7 (permalink)
Themenstarter
 
Registriert seit: 09.03.09
Karma: 3
Burgess Leistung: Facit NTK
Standard

Verwirrt hat mich, dass bei diesen Implementierung das Pivot selbst mit gemischt wird und nicht genau die Trennung zwischen den Teilmengen bildet.
Dass die Teilmengen immer genau passen hatte ich auch bemerkt. (Immerhin klappt ja alles).

Mich würde interessieren ob diese Vorgehensweiße irgendwie eine Optimierung von Quicksort ist? Oder schneller ist?
Burgess ist offline  
Digg this Post!Add Post to del.icio.usBookmark Post in Technorati
Mit Zitat antworten
Antwort

[HaBo] » Software Home » Code Kitchen » Quicksort
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind aus
Pingbacks sind an
Refbacks sind an


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
[JAVA] quicksort sortiert nicht komplett MrSpider Code Kitchen 7 04.06.08 15:36


1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194