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";


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值