sorting - Making the sort stable in Perl -


i have array of refs me .

$a[0] = [qw( 1 2 3 4 )]; $a[1] = [qw( b c d )]; 

the 1,2,3,4 website breadcrumbs used navigation (home, profile, contact-us, contact-me-specifically).

now, have sort ladder (and using stable sort in perl 5.8 not option sadly)

the sorting criteria is

  1. the depth of ladder
  2. if 2 ladders have same depth, sort them depending on index.

for example, if array contains

$a[0] = [qw( 1 2 3 4 )]; $a[1] = [qw( 1 2 3 )]; 

then after sort, array should contain

$a[0] = [qw( 1 2 3 )]; $a[1] = [qw( 1 2 3 4 )]; 

but if arrays :-

$a[0] = [qw( 1 2 3 )]; $a[1] = [qw( b c )]; 

then after sort,

$a[0] = [qw( 1 2 3 )]; $a[1] = [qw( b c )]; 

i can't work way tried .

my @sorted_array = sort { @$b <=> @$a || $a <=> $b } @a; 

can me in this?

the description of data structure (linked list), , implementation in sort routine (arrayrefs) not quite fit together; assume latter.

a non-stable sort can made stable sorting position secondary criterion:

sort { or by_index } @stuff 

normally, seem want compare array length. able test index, have somehow make index of current element available. can 2 means:

  1. do schwartzian transform, , annotate each element index. silly.
  2. sort indices, not elements.

this like:

my @sorted_indices =   sort { @{ $array[$b] } <=> @{ $array[$a] } or $a <=> $b } 0 .. $#array; @sorted = @array[@sorted_indices]; # slice 

what doing $a <=> $b comparing refernces. not guaranteed meaningful.

test of sort:

use test::more; @array = (   [qw/1 2 3/],   [qw/a b c/],   [qw/foo bar baz qux/], ); @expected = (   [qw/foo bar baz qux/],   [qw/1 2 3/],   [qw/a b c/], );  ...; # above code is_deeply \@sorted, \@expected; done_testing; 

Comments