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:
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)
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.
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:
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.