7 typedef int T; /* type of item to be sorted */
9 #define MAXSTACK (sizeof(size_t) * CHAR_BIT)
11 #define exchange(a, b, size) \
18 for (s = sizeof(int); s <= size; s += sizeof(int)) { \
25 for (s = s - sizeof(int) + 1; s <= size; s++) { \
32 void qsort(void *base, size_t nmemb, size_t size,
33 int (*compar)(const void *, const void *)) {
34 void *lbStack[MAXSTACK], *ubStack[MAXSTACK];
42 lbStack[0] = (char *)base;
43 ubStack[0] = (char *)base + (nmemb-1)*size;
44 for (sp = 0; sp >= 0; sp--) {
48 lb = (char *)lbStack[sp];
49 ub = (char *)ubStack[sp];
53 /* select pivot and exchange with 1st element */
54 offset = (ub - lb) >> 1;
55 P = lb + offset - offset % size;
56 exchange (lb, P, size);
58 /* partition into two segments */
62 while (i < j && compar(lb, i) > 0) i += size;
63 while (j >= i && compar(j, lb) > 0) j -= size;
65 exchange (i, j, size);
70 /* pivot belongs in A[j] */
71 exchange (lb, j, size);
74 /* keep processing smallest segment, and stack largest */
75 if (m - lb <= ub - m) {
77 lbStack[sp] = m + size;
84 ubStack[sp++] = m - size;
92 void fill(T *lb, T *ub) {
95 for (i = lb; i <= ub; i++) *i = rand();
98 int Comp(const void *a, const void *b) { return *(T *)a - *(T *)b; }
100 int main(int argc, char *argv[]) {
113 maxnum = atoi(argv[1]);
114 if ((a = malloc(maxnum * sizeof(T))) == 0) {
115 fprintf (stderr, "insufficient memory (a)\n");
118 lb = a; ub = a + maxnum - 1;
121 qsort(a, maxnum, sizeof(T), Comp);