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