home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / snip9707.zip / RG_ISORT.C < prev    next >
C/C++ Source or Header  |  1997-07-05  |  1KB  |  41 lines

  1. /* +++Date last modified: 05-Jul-1997 */
  2.  
  3. /*
  4. ** isort()  --  insertion sort
  5. **
  6. ** Raymond Gardner   public domain   2/93
  7. **
  8. ** qsort() compatible, but uses insertion sort algorithm.
  9. */
  10.  
  11. #include <stddef.h>             /* for size_t definition */
  12. #include "snipsort.h"
  13.  
  14. void isort(void *base, size_t nmemb, size_t size,
  15.             int (*comp)(const void *, const void *))
  16. {
  17.       char *i, *j, *lim;
  18.  
  19.       lim = (char *)base + nmemb * size;    /* pointer past end of array */
  20.       for ( j = (char *)base, i = j+size; i < lim; j = i, i += size )
  21.       {
  22.             for ( ; comp((void *)j, (void *)(j+size)) > 0; j -= size )
  23.             {
  24.                   char *a, *b;
  25.                   char tmp;
  26.                   size_t k = size;
  27.  
  28.                   a = j;
  29.                   b = a + size;
  30.                   do
  31.                   {
  32.                         tmp = *a;
  33.                         *a++ = *b;
  34.                         *b++ = tmp;
  35.                   } while ( --k );
  36.                   if ( j == (char *)base )
  37.                         break;
  38.             }
  39.       }
  40. }
  41.