1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- #include <stdlib.h>
- #include <assert.h>
- void qsort (void *base,
- size_t nel,
- size_t width,
- int (*comp)(const void *, const void *))
- {
- size_t wgap, i, j, k;
- char *a, *b, tmp;
-
- assert(width > 0);
- if (nel > 1) {
- for (wgap = 0; ++wgap < (nel-1)/3 ; wgap *= 3) {}
- wgap *= width;
- nel *= width;
- do {
- for (i = wgap; i < nel; i += width) {
- for (j = i - wgap; ;j -= wgap) {
- a = j + ((char *)base);
- b = a + wgap;
- if ( (*comp)(a, b) <= 0 ) {
- break;
- }
- k = width;
- do {
- tmp = *a;
- *a++ = *b;
- *b++ = tmp;
- } while ( --k );
- if (j < wgap) {
- break;
- }
- }
- }
- wgap = (wgap - width)/3;
- } while (wgap);
- }
- }
|