login

Perl Heap Sort

In this tutorial, you will learn how heap sort is implemented in Perl.

#!/usr/bin/perl -w

use integer;

sub heapify;

sub heapsort {
    my $array = shift;

    foreach ( my $index = 1 + @$array / 2; $index--; ) {
        heapify $array, $index;
    }

    foreach ( my $last = @$array; --$last; ) {
        @{ $array }[ 0, $last ] = @{ $array }[ $last, 0 ];
        heapify $array, 0, $last;
    }
}

sub heapify {
    my ($array, $index, $last) = @_;

    $last = @$array unless defined $last;

    my $swap = $index;
    my $high = $index * 2 + 1;

    foreach ( my $try = $index * 2;
                 $try < $last && $try <= $high;
                 $try ++ ) {
        $swap = $try if $array->[ $try ] gt $array->[ $swap ];
    }

    unless ( $swap == $index ) {
        # The heap is in disorder: must reshuffle.
        @{ $array }[ $swap, $index ] = @{ $array }[ $index, $swap ];
        heapify $array, $swap, $last;
    }
}

@array = qw(I have a holographic chocolate bar.
            No, really. I am supposed to save
            it because it is like art or something. But I am really
            hungry and I have been checking these examples all day.
            I think I deserve a reward.);

heapsort( \@array );

print "@array\n";