/* * qsort.c * * Ullrich von Bassewitz, 09.12.1998 */ #include static void QuickSort (void* Base, int Lo, int Hi, size_t Size, int (*Compare)(const void*, const void*)) /* Internal recursive function. Works with ints, but this shouldn't be * a problem. */ { int I, J; /* Get a char pointer */ unsigned char* B = Base; /* Quicksort */ while (Hi > Lo) { I = Lo + Size; J = Hi; while (I <= J) { while (I <= J && Compare (B + Lo, B + I) >= 0) { I += Size; } while (I <= J && Compare (B + Lo, B + J) < 0) { J -= Size; } if (I <= J) { _swap (B + I, B + J, Size); I += Size; J -= Size; } } if (J != Lo) { _swap (B + J, B + Lo, Size); } if (((unsigned) J) * 2 > (Hi + Lo)) { QuickSort (Base, J + Size, Hi, Size, Compare); Hi = J - Size; } else { QuickSort (Base, Lo, J - Size, Size, Compare); Lo = J + Size; } } } void qsort (void* base, size_t nmemb, size_t size, int (*compare)(const void*, const void*)) /* Quicksort implementation */ { if (nmemb > 1) { QuickSort (base, 0, (nmemb-1) * size, size, compare); } }