cl: Sorting Sequences

 
 9.5 Sorting Sequences
 =====================
 
  -- Function: cl-sort seq predicate &key :key
      This function sorts SEQ into increasing order as determined by
      using PREDICATE to compare pairs of elements.  PREDICATE should
      return true (non-‘nil’) if and only if its first argument is less
      than (not equal to) its second argument.  For example, ‘<’ and
      ‘string-lessp’ are suitable predicate functions for sorting numbers
      and strings, respectively; ‘>’ would sort numbers into decreasing
      rather than increasing order.
 
      This function differs from Emacs’s built-in ‘sort’ in that it can
      operate on any type of sequence, not just lists.  Also, it accepts
      a ‘:key’ argument, which is used to preprocess data fed to the
      PREDICATE function.  For example,
 
           (setq data (cl-sort data 'string-lessp :key 'downcase))
 
      sorts DATA, a sequence of strings, into increasing alphabetical
      order without regard to case.  A ‘:key’ function of ‘car’ would be
      useful for sorting association lists.  It should only be a simple
      accessor though, since it’s used heavily in the current
      implementation.
 
      The ‘cl-sort’ function is destructive; it sorts lists by actually
      rearranging the CDR pointers in suitable fashion.
 
  -- Function: cl-stable-sort seq predicate &key :key
      This function sorts SEQ “stably”, meaning two elements which are
      equal in terms of PREDICATE are guaranteed not to be rearranged out
      of their original order by the sort.
 
      In practice, ‘cl-sort’ and ‘cl-stable-sort’ are equivalent in Emacs
      Lisp because the underlying ‘sort’ function is stable by default.
      However, this package reserves the right to use non-stable methods
      for ‘cl-sort’ in the future.
 
  -- Function: cl-merge type seq1 seq2 predicate &key :key
      This function merges two sequences SEQ1 and SEQ2 by interleaving
      their elements.  The result sequence, of type TYPE (in the sense of
      ‘cl-concatenate’), has length equal to the sum of the lengths of
      the two input sequences.  The sequences may be modified
      destructively.  Order of elements within SEQ1 and SEQ2 is preserved
      in the interleaving; elements of the two sequences are compared by
      PREDICATE (in the sense of ‘sort’) and the lesser element goes
      first in the result.  When elements are equal, those from SEQ1
      precede those from SEQ2 in the result.  Thus, if SEQ1 and SEQ2 are
      both sorted according to PREDICATE, then the result will be a
      merged sequence which is (stably) sorted according to PREDICATE.