home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / listings / v_11_07 / shell.c < prev    next >
C/C++ Source or Header  |  1992-12-12  |  999b  |  35 lines

  1. #include <stdlib.h>
  2. #include <malloc.h>
  3.  
  4. int my_shellsort( char *data, unsigned n_elements, unsigned esize,
  5.                      int (*compare)(void *elem1, void *elem2))
  6. {
  7.    unsigned i, gap, spacing;
  8.    char *tptr, *endptr, *tptr1, *tbuff;
  9.    int rval = 0;
  10.  
  11.    tbuff = _alloca( esize);
  12.    for( gap = 1; gap < n_elements / 3U; gap = gap * 3 + 1);
  13.       ;
  14.    endptr = data + n_elements * esize;
  15.    while( gap)
  16.       {
  17.       spacing = esize * gap;
  18.       for( i = 0; i < gap; i++)
  19.          for( tptr = data + i * esize; tptr < endptr; tptr = tptr1)
  20.             if( (compare)(tptr, tptr1 = tptr + spacing) > 0)
  21.                {
  22.                char *back_up;
  23.  
  24.                memcpy( tbuff, tptr, esize);
  25.                memcpy( tptr, tptr1, esize);
  26.                memcpy( tptr1, tbuff, esize);
  27.                if( (back_up = tptr - spacing) >= data)
  28.                   tptr1 = back_up;
  29.                rval = 1;
  30.                }
  31.       gap /= 3;
  32.       }
  33.    return( rval);
  34. }
  35.