Julius 4.2
|
00001 00029 static void 00030 internal_quick_sort(char *left, char *right, int size, int (*compare)(const void *, const void *, void *), void *pointer) 00031 { 00032 char *p = left; 00033 char *q = right; 00034 char *t = left; 00035 00036 while (1) { 00037 while ((*compare)(p, t, pointer) < 0) 00038 p += size; 00039 while ((*compare)(q, t, pointer) > 0) 00040 q -= size; 00041 if (p > q) 00042 break; 00043 if (p < q) { 00044 int i; 00045 for (i = 0; i < size; i++) { 00046 char x = p[i]; 00047 p[i] = q[i]; 00048 q[i] = x; 00049 } 00050 if (t == p) 00051 t = q; 00052 else if (t == q) 00053 t = p; 00054 } 00055 p += size; 00056 q -= size; 00057 if (p > q) break; 00058 } 00059 if (left < q) 00060 internal_quick_sort(left, q, size, compare, pointer); 00061 if (p < right) 00062 internal_quick_sort(p, right, size, compare, pointer); 00063 } 00064 00076 void 00077 qsort_reentrant(void *base, int count, int size, int (*compare)(const void *, const void *, void *), void *pointer) 00078 { 00079 if (count > 1) { 00080 internal_quick_sort((char *) base, (char *) base + (count-1)*size, size, compare, pointer); 00081 } 00082 } 00083 00084 /* end of file */