perl 实现的基本排序算法

 #! /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--;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值