% ASORT
% a pedestrian NUMERICAL SORTER of ALPHANUMERIC data
 
% - create some data
          d = {
%         strings with one valid alphanumeric number
%         sorted numerically
                  '-inf'
                  'x-3.2e4y'
                  'f-1.4'
                  '-.1'
                  '+ .1d-2'
                  '.1'
                  'f.1'
                  'f -+1.4'
                  'f.2'
                  'f.3'
                  'f.10'
                  'f.11'
                  '+inf'
                  ' -nan'
                  '+ nan'
                  'nan'
%         strings with many numbers or invalid/ambiguous numbers
%         sorted in ascii dictionary order
                  ' nan nan'
                  '+ .1e-.2'
                  '-1 2'
                  'Z12e12ez'
                  'inf -inf'
                  's.3TT.4'
                  'z12e12ez'
%         strings without numbers
%         sorted in ascii dictionary order
                  ' . .. '
                  '.'
                  '...'
                  '.b a.'
                  'a string'
                  'a. .b'
          };
%   ... and scramble it...
          rand('seed',10);
          d=d(randperm(numel(d)));
 
% - run ASORT with
%   verbose output:              <-v>
%   keep additional results:     <-d>
          o=asort(d,'-v','-d');
% - or
%         p=asort(char(d),'-v','-d');
 
    'INPUT'       'ASCII SORT'    'NUM SORT'             'NUM READ'         
    '...'         ' -nan'         '--- NUMERICAL'        '--- NUMBERS'      
    '+ .1e-.2'    ' . .. '        '-inf'                 [             -Inf]
    '.1'          ' nan nan'      'x-3.2e4y'             [           -32000]
    '.b a.'       '+ .1d-2'       'f-1.4'                [             -1.4]
    '-inf'        '+ .1e-.2'      '-.1'                  [             -0.1]
    'f.1'         '+ nan'         '+ .1d-2'              [            0.001]
    ' -nan'       '+inf'          '.1'                   [              0.1]
    '-1 2'        '-.1'           'f.1'                  [                1]
    'nan'         '-1 2'          'f -+1.4'              [              1.4]
    'a string'    '-inf'          'f.2'                  [                2]
    'f.3'         '.'             'f.3'                  [                3]
    '+ .1d-2'     '...'           'f.10'                 [               10]
    'a. .b'       '.1'            'f.11'                 [               11]
    's.3TT.4'     '.b a.'         '+inf'                 [              Inf]
    '+inf'        'Z12e12ez'      ' -nan'                [              NaN]
    ' nan nan'    'a string'      '+ nan'                [              NaN]
    'f-1.4'       'a. .b'         'nan'                  [              NaN]
    'x-3.2e4y'    'f -+1.4'       '--- ASCII NUMBERS'    '--- ASCII NUMBERS'
    'inf -inf'    'f-1.4'         ' nan nan'             ' nan nan'         
    '+ nan'       'f.1'           '+ .1e-.2'             '+ .1e-.2'         
    'f.2'         'f.10'          '-1 2'                 '-1 2'             
    'f.11'        'f.11'          'Z12e12ez'             'Z12e12ez'         
    'Z12e12ez'    'f.2'           'inf -inf'             'inf -inf'         
    'z12e12ez'    'f.3'           's.3TT.4'              's.3TT.4'          
    'f -+1.4'     'inf -inf'      'z12e12ez'             'z12e12ez'         
    ' . .. '      'nan'           '--- ASCII STRINGS'    '--- ASCII STRINGS'
    'f.10'        's.3TT.4'       ' . .. '               ' . .. '           
    '.'           'x-3.2e4y'      '.'                    '.'                
    '-.1'         'z12e12ez'      '...'                  '...'              
    ' '           ' '             '.b a.'                '.b a.'            
    ' '           ' '             'a string'             'a string'         
    ' '           ' '             'a. .b'                'a. .b'            
 
% - show results
          o
o = 
          magic: 'ASORT'
            ver: '25-Nov-2005 20:46:56'
           time: '25-Nov-2005 20:49:03'
        runtime: 0.047
    input_class: 'cell'
    input_msize: [29 1]
    input_bytes: 2038
    strng_class: 'char'
    strng_msize: [29 8]
    strng_bytes: 464
            anr: {16x1 cell}         numerically sorted strings with one number
            snr: {7x1 cell}          ascii dictionary sorted strings with numbers
            str: {6x1 cell}          ascii dictionary sorted strings without numbers
            aix: [16x1 double]       indices into INP: anr = INP(aix)
            six: [7x1 double]        indices into INP: snr = INP(six)
            tix: [6x1 double]        indices into INP: str = INP(tix)
         ixtest: [1 1 1]             test result of index validity
              c: [29x12 char]
              t: [29x12 logical]
              n: [16x12 char]
              d: [16x1 double]
 
          o.anr
ans = 
    '-inf'
    'x-3.2e4y'
    'f-1.4'
    '-.1'
    '+ .1d-2'
    '.1'
    'f.1'
    'f -+1.4'
    'f.2'
    'f.3'
    'f.10'
    'f.11'
    '+inf'
    ' -nan'
    '+ nan'
    'nan'
 
% - run ASORT with no-space/template options
%   NOTE the impact of -w/-t order!
          s={'ff - 1','ff + 1','- 12'};
 
%   RAW
          o=asort(s,'-v');
 
    'INPUT'     'ASCII SORT'    'NUM SORT'             'NUM READ'         
    'ff - 1'    '- 12'          '--- NUMERICAL'        '--- NUMBERS'      
    'ff + 1'    'ff + 1'        'ff + 1'               [                1]
    '- 12'      'ff - 1'        'ff - 1'               [                1]
    ' '         ' '             '- 12'                 [               12]
    ' '         ' '             '--- ASCII NUMBERS'    '--- ASCII NUMBERS'
    ' '         ' '             '--- ASCII STRINGS'    '--- ASCII STRINGS'
 
%   remove SPACEs
          o=asort(s,'-v','-d','-w');
 
    'INPUT'    'ASCII SORT'    'NUM SORT'             'NUM READ'         
    'ff-1'     '-12'           '--- NUMERICAL'        '--- NUMBERS'      
    'ff+1'     'ff+1'          '-12'                  [              -12]
    '-12'      'ff-1'          'ff-1'                 [               -1]
    ' '        ' '             'ff+1'                 [                1]
    ' '        ' '             '--- ASCII NUMBERS'    '--- ASCII NUMBERS'
    ' '        ' '             '--- ASCII STRINGS'    '--- ASCII STRINGS'
 
%   remove TEMPLATE(s)
          o=asort(s,'-v','-d','-t',{'ff','1'});
 
    'INPUT'    'ASCII SORT'    'NUM SORT'             'NUM READ'         
    ' - '      ' + '           '--- NUMERICAL'        '--- NUMBERS'      
    ' + '      ' - '           '- 2'                  [                2]
    '- 2'      '- 2'           '--- ASCII NUMBERS'    '--- ASCII NUMBERS'
    ' '        ' '             '--- ASCII STRINGS'    '--- ASCII STRINGS'
    ' '        ' '             ' + '                  ' + '              
    ' '        ' '             ' - '                  ' - '              
 
%   remove TEMPLATE(s) than SPACEs
          o=asort(s,'-v','-d','-t','1','-w');
 
    'INPUT'    'ASCII SORT'    'NUM SORT'             'NUM READ'         
    'ff-'      '-2'            '--- NUMERICAL'        '--- NUMBERS'      
    'ff+'      'ff+'           '-2'                   [               -2]
    '-2'       'ff-'           '--- ASCII NUMBERS'    '--- ASCII NUMBERS'
    ' '        ' '             '--- ASCII STRINGS'    '--- ASCII STRINGS'
    ' '        ' '             'ff+'                  'ff+'              
    ' '        ' '             'ff-'                  'ff-'              
 
%   remove SPACEs than TEMPLATE(s)
          o=asort(s,'-v','-d','-w','-t','1');
 
    'INPUT'    'ASCII SORT'    'NUM SORT'             'NUM READ'         
    'ff- '     '- 2'           '--- NUMERICAL'        '--- NUMBERS'      
    'ff+ '     'ff+ '          '- 2'                  [                2]
    '- 2'      'ff- '          '--- ASCII NUMBERS'    '--- ASCII NUMBERS'
    ' '        ' '             '--- ASCII STRINGS'    '--- ASCII STRINGS'
    ' '        ' '             'ff+ '                 'ff+ '             
    ' '        ' '             'ff- '                 'ff- '