http://qs1969.pair.com?node_id=11138210


in reply to Sorting numerials first and then numerials with alpha characters last

Though there are ways to do it in a single pass, I found it a bit easier to think about if one first splits the list out into two and then sorts them individually. Note I'm using Sort::Key::Natural to sort the mixed values in a hopefully intuitive way (Update: you may note I added the test case "12c" to demonstrate the difference to a simple sort).

use warnings; use strict; use Test::More; use List::Util qw/uniq/; use Sort::Key::Natural qw/natsort/; my @in = ( "2bc", "1", "12c", "12", "21", "1", "1a", "2", "2", "2", "2", "3", "35", "31", "2b", "4", "42", "5", "51", "2ac", "52", "6", "7" ); my @expect = ( "1", "2", "3", "4", "5", "6", "7", "12", "21", "31", "35","42", "51", "52", "1a", "2ac", "2b", "2bc", "12c" ); my (@nums, @mixed); /^\d+$/ and push @nums, $_ or push @mixed, $_ for @in; my @out = uniq( sort( { $a <=> $b } @nums), natsort(@mixed), ); is_deeply \@out, \@expect or diag explain \@out; done_testing;

As opposed to your previous thread, these tags look much more like HTML/XML, so you really should use an appropriate parser!

Replies are listed 'Best First'.
Re^2: Sorting numerials first and then numerials with alpha characters last
by ikegami (Patriarch) on Oct 29, 2021 at 18:27 UTC

    That code assumes sort is stable. Use use sort 'stable'; to guarantee that.

      That code assumes sort is stable. Use use sort 'stable'; to guarantee that.

      what?

        Chaining sorts only works for stable sorts. What is stability in sorting algorithms and why is it important?

        Perl's sort isn't even stable in all versions of Perl, so the solution won't work in all existing versions of Perl.

        Perl's sort isn't guaranteed to be a stable sort, so the solution isn't guaranteed to work in future versions of Perl.

        But, you can tell sort to use a stable algorithm using use sort 'stable';.