Steven Massey wrote:

>
> I have an array, each line contains fields seperated by ":"
> I want to sort the array numerically ascending by the last field.
> 
>  my thoughts are to split fields into seperate arrays, go through the last
> array in a comparing process, moving each row index in the original array
> to reflect the sort. ( I found this hard to explain)
> 
> Do any of you some tips as to how to approach this ??
> 

not suprisingly, there are many approach to this. i actually take some time 
to benchmark some of the most populars and see what will be better:

#!/usr/bin/perl -w
use strict;

use Benchmark;

my @array = ('abcd:xxx:1234','yyy:xxx:2','a:b:12');

sub sr_s{
        for(sort {(my $a_value = $a) =~ s/.+:.+://;
                  (my $b_value = $b) =~ s/.+:.+://;
                  $a_value <=> $b_value} @array){;}
}

sub split_s{
        for(sort {my @a_val = split(/:/,$a);
                  my @b_val = split(/:/,$b);
                  $a_val[2] <=> $b_val[2]} @array){;}
}

sub split_ref_s{
        for(sort {(split(/:/,$a))[2] <=> (split(/:/,$b))[2]} @array){;}
}

sub reg_s{
        for(sort { my ($i) = $a =~ /(\d+)$/;
                   my ($j) = $b =~ /(\d+)$/; $i <=> $j} @array){;}
}

sub reg_ref_s{
        for(sort {($a =~ /(\d+)$/)[0] <=> ($b =~ /(\d+)$/)[0]} @array){;}
}

timethese(99999,{split_s     => \&split_s,
                 split_ref_s => \&split_ref_s,
                 reg_s       => \&reg_s,
                 reg_ref_s   => \&reg_ref_s,
                 sr_s        => \&sr_s});

__END__

prints:

Benchmark: timing 99999 iterations of 

reg_ref_s, reg_s, split_ref_s, split_s, sr_s...

reg_ref_s: 35 wallclock secs (15.13 usr +  0.02 sys = 15.15 CPU) @ 6600.59/s 
(n=99999)

     reg_s: 40 wallclock secs (18.17 usr +  0.02 sys = 18.19 CPU) @ 
5497.47/s (n=99999)

split_ref_s: 30 wallclock secs (13.87 usr +  0.01 sys = 13.88 CPU) @ 
7204.54/s (n=99999)

   split_s: 54 wallclock secs (23.12 usr +  0.03 sys = 23.15 CPU) @ 
4319.61/s (n=99999)

      sr_s: 31 wallclock secs (13.37 usr +  0.01 sys = 13.38 CPU) @ 
7473.77/s (n=99999)

looks like sr_s is the winner.

david

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to