#! /usr/bin/perl -w
use strict;
use POSIX;
use Data::Dumper;
my @data = &generate_rand( 100 );#(3, 5,4, 43,990, 43,54, 2, 7, 45);
#print Insert_sort(/@data);
#&Selection_sort(/@data);
#&merge_sort ( /@data, 0, (scalar @data -1 ));
#&bubble_sort(/@data);
#&quick_sort( /@data, 0, ( scalar @data ) -1);
&heap_sort( /@data);
print Dumper /@data;
sub generate_rand {
my $num = shift;
my @result = map {int rand (100);} (0 .. $num-1);
return ( @result );
}
sub Insert_sort {
my $data = shift;
for my $index ( 1 .. scalar @$data - 1 ){
my $i = $index - 1 ;
my $value = $data->[$index];
while ( $i >= 0 ){
if ( $value < $data->[$i] ){
$data->[$i+1] = $data->[$i];
}
else{
last;
}
$i--;
}
$data->[$i+1] = $value;
}
}
sub Selection_sort{
my $data = shift;
for my $index ( 0 .. scalar @$data - 2 ){
my $min = $data->[$index];
my $i = $index + 1;
my $key;
while ($i <= ( scalar @$data - 1 ) ){
if ( $min > $data->[$i] ){
$min = $data->[$i];
$key = $i;
}
$i++;
}
if ( $min != $data->[$index] && defined $key ){
( $data->[$index], $data->[$key] ) = ( $data->[$key], $data->[$index]);
}
}
}
sub merge_sort{
my $data = shift;
my ( $begin, $end ) = @_;
if ( $begin < $end ){
my $mid = floor( ( $begin + $end )/2 );
&merge_sort( $data, $begin, $mid );
&merge_sort( $data, $mid+1, $end );
&merge ( $data, $begin, $end, $mid);
}
}
sub merge {
my $data = shift;
my ( $begin, $end, $mid ) = @_;
my @result ;
my ($i, $j) = ( $begin, $mid + 1);
while ( $i <= $mid && $j <= $end){
if ( $data->[$i] < $data->[$j] ){
push @result, $data->[$i];
$i++;
}
else{
push @result, $data->[$j];
$j++;
}
}
if ( $i > $mid ){
while( $j <= $end ){
push @result, $data->[$j] ;
$j++;
}
}
if ( $j > $end ) {
while ( $i <= $mid ){
push @result, $data->[$i];
$i++;
}
}
@$data[ $begin .. $end ] = @result;
}
sub quick_sort{
my $data = shift;
my ( $begin, $end ) = @_;
if ( $begin < $end ){
my $i = $begin + 1;
my $key = $data->[$begin];
my $j = $begin;
while ( $i <= $end ){
if ( $data->[$i] < $key ){
( $data->[$i], $data->[$j]) = ( $data->[++$j], $data->[$i]);
}
$i++;
}
( $data->[$begin], $data->[$j]) = ( $data->[$j], $data->[$begin]);
&quick_sort( $data, $begin, $j-1);
&quick_sort( $data, $j+1, $end);
}
}
sub heap_sort{
my $data = shift;
my $i = @$data/2;
while ( $i>=1 ){
&adjust_heap( $data, $i, scalar @$data);
$i--;
}
$i = @$data;
while ($i >=1 ){
( $data->[$i-1] ,$data->[0] ) = ( $data->[0], $data->[$i-1]);
$i--;
&adjust_heap( $data, 1, $i);
}
}
sub adjust_heap {
my $data = shift;
my ( $index, $length ) = @_;
my $i = $index * 2;
my $key = $data->[$index-1];
while ( $i<= $length ){
if ( $i < $length && $data->[$i-1] < $data->[$i]){
$i++;
}
if ( $key > $data->[$i -1]){
last;
}
$data->[ int ( $i/2 ) -1 ] = $data->[$i -1 ];
$i *= 2;
}
$data->[ $i/2 -1 ] = $key;
}
sub bubble_sort{
my $data = shift;
my $max = scalar @$data;
my $i = $max - 1;
while ( $i > 1 ) {
my $index = 0;
my $flag = 0;
while ( $index < $i){
if ( $data->[$index] > $data->[$index+1] ){
( $data->[$index], $data->[$index+1] ) = ( $data->[$index+1], $data->[$index] );
$flag = 1;
}
$index ++;
}
if ( $flag == 0 ){
print "ok ";
last;
}
$i--;
}
}