加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Perl 堆排序

发布时间:2020-12-16 00:21:02 所属栏目:大数据 来源:网络整理
导读:看了算法导论堆排序,用Perl 实现一下,具体原理不解释,做个记录。 代码: @a = map {int(rand 100)} 1..20;sub build_heap{ my $length = $#_; for(my $i = $length1; $i = 0; $i--){ heapnify(@_,$length,$i); }}sub heapnify{ #~ $x++; #use it to trac

看了算法导论堆排序,用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,$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,$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 "@an";

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读