( ISORT                                 sort an n-number array )

need pick need <cmove
: isort                           ( addr n --- )
  dup + over + over 2+            ( limits = addr+2n and addr+2)
  do
    i @ dup i 2 - @ <             ( number < preceding?)
    if 0 3 pick 2 - i 2 -         ( limits = addr-2 and i-2)
      do
        drop dup i @ <            ( number < this number?)
        if i else i 2+ leave endif     ( yes-save, no-insert)
      -2 +loop                    ( index by -2)
      dup dup 2+ i 3 pick - <cmove !   ( open gap and insert)
    else drop endif               ( drop search number)
  2 +loop drop                    ( loop by 2)
;
