QuickSort-Algorithmus, Umsetzungsbeispiel mit Perl

@zahlen = ( 11, 3, 53, 12, 83, 24, 2, 8, 17, 9, 39 );

$z = @zahlen;
&qsort(0, $z-1);

foreach my $n (@zahlen)
{
        print "$n ";
}

sub qsort()
{
        my $left = shift; my $right = shift;
       
        if($left < $right)
        {
                my $part = dopart($left, $right);
               
                &qsort($left, $part -1);
                &qsort($part +1, $right);
        }
}

sub dopart()
{
        my $left = shift; my $right = shift;
       
        my $le = $left; # Arbeitsvariable
        my $ri = $right; # Arbeitsvariable
       
        my $pivotPos = $right; # die Position des Pivot-Elements
        my $pivotWert = $zahlen[$pivotPos];
       
        while($le < $ri) # die linke und rechte Arbeitsvariable dürfen nicht aneinander vorbeilaufen
        {
                # von links nach rechts suchen
                while( $zahlen[$le] <= $pivotWert && $le < $right )
                {
                        $le += 1;
                }
                # von rechts nach links suchen
                while( $zahlen[$ri] >= $pivotWert && $ri > $left )
                {
                        $ri -= 1;
                }
               
                if($le < $ri) # nicht bereits aneinander vorbeigelaufen?
                {
                        swap($le, $ri); # Positionen tauschen
                }
        }
       
        if($zahlen[$le] > $pivotWert)
        {
                swap($le, $pivotPos);
        }
       
        return $le;
}


sub swap()
{
        my $a = shift; my $b = shift;
       
        my $remA = $zahlen[$a];
        $zahlen[$a] = $zahlen[$b];
        $zahlen[$b] = $remA;
}