2 #include "lib_string.h"
5 #define MAXSTACK (sizeof(int) * CHAR_BIT)
7 static void qsexchange(void *a
, void *b
, size_t size
)
15 for (i
= sizeof(int); i
<= size
; i
+= sizeof(int)) {
17 *((int *)a
++) = *((int *)b
);
20 for (i
= i
- sizeof(int) + 1; i
<= size
; i
++) {
21 char t
= *((char *)a
);
22 *((char *)a
++) = *((char *)b
);
27 void qsort(void *base
, size_t nmemb
, size_t size
,
28 int (*compar
)(const void *, const void *))
30 void *lbStack
[MAXSTACK
], *ubStack
[MAXSTACK
];
38 lbStack
[0] = (char *)base
;
39 ubStack
[0] = (char *)base
+ (nmemb
-1)*size
;
40 for (sp
= 0; sp
>= 0; sp
--) {
49 /* select pivot and exchange with 1st element */
50 offset
= (ub
- lb
) >> 1;
51 P
= lb
+ offset
- offset
% size
;
52 qsexchange (lb
, P
, size
);
54 /* partition into two segments */
58 while (i
< j
&& compar(lb
, i
) > 0) i
+= size
;
59 while (j
>= i
&& compar(j
, lb
) > 0) j
-= size
;
61 qsexchange (i
, j
, size
);
66 /* pivot belongs in A[j] */
67 qsexchange (lb
, j
, size
);
70 /* keep processing smallest segment, and stack largest */
71 if (m
- lb
<= ub
- m
) {
73 lbStack
[sp
] = m
+ size
;
81 ubStack
[sp
++] = m
- size
;