Julius 4.2
libsent/src/util/qsort.c
説明を見る。
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 */