クイックソート非再帰版

perlを久しぶりに勉強したついでになんとなく作ってみました。

sub quicksort{
    my @stack;
    my ($left,$right,$last,$i);

    if(@_ < 2){
        return;
    }

    push @stack,$#_;
    push @stack,0;

    while(@stack){
        $left = pop @stack;     #左端の要素番号を取り出す
        $right = pop @stack;    #右端の要素番号を取り出す

        if($left >= $right){
            next;
        }
               #左端が基準値
        $last = $left;     #$left以上$last以下に基準値以下の要素が入っている
        for($i = $left + 1;$i <= $right;$i++){
            if($_[$left] > $_[$i]){
                ++$last;
                @_[$last,$i] = @_[$i,$last];
            }   
        }   

        @_[$left,$last] = @_[$last,$left];
   
        #スタックに追加
        push @stack,$last - 1;
        push @stack,$left;
        push @stack,$right;
        push @stack,$last + 1;
    }   
}

ちょうど1年前ぐらいになんかの本でクイックソート再帰版を読んだ時はよく理解できなかったので、今回なにも見ずにかけてちょっとうれしいです。