Perl 堆排序

看了算法導論堆排序,用Perl 實現一下,具體原理不解釋,做個記錄。


代碼:

@a = map {int(rand 100)} 1..20;

sub build_heap{
     my $length = $#_;
     for(my $i = $length>>1; $i >= 0; $i--){
          heapnify(\@_, $length, $i);
     }
}

sub heapnify{
     #~ $x++; #use it to trace how much times the procedure was run
     my ($array, $length, $index) = @_;
    
     my $max = $array->[$index];
     my $tmp = $index;
     my $left = left($index);
     my $right = right($index);
    
     if($left <= $length && $array->[$left] > $max){
          $max = $array->[$left];
          $tmp = $left;
     }
     if($right <= $length && $array->[$right] > $max){
          $max = $array->[$right];
          $tmp = $right;
     }
    
     if($tmp != $index){
          ($array->[$index], $array->[$tmp]) = ($array->[$tmp], $array->[$index]);
          heapnify($array, $length, $tmp) if $tmp <= $length>>1;
     }
}

sub left      { ($_[0]<<1) + 1 }
sub right     { left(@_) + 1 }

sub max_heap{
     build_heap(@_);
     @_[0,-1] = @_[-1,0];
     for(my $i=$#_-1;$i>0;$i--){
          heapnify(\@_,$i,0);
          @_[0,$i] = @_[$i,0];
     }
}

max_heap(@a);
print "@a\n";


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章