/*--------------------------------------------------------------------------*/
/* Purpose: qsort */
/*--------------------------------------------------------------------------*/
static void swapmem(char *a, char *b, size_t size)
{
register char t;
register int i;
for (i = 0; i < size; ++i,++b,++a) {
t = *a;
*a = *b;
*b = t;
}
}
/*
qsort() 함수는 빠르게 정렬을 시킵니다.
nmemb를 정렬시킬 위치를 나타냅니다.
base는 정렬할 첫번째 요소를 나타냅니다.
size는 정렬할 갯수를 지정합니다.
compar()는 정렬시킬 규칙을 나타냅니다.
*/
void qsort( void *base, size_t nmemb, size_t size,
int (*compar)(const void *, const void *))
{
char *i;
char *j;
char *x;
char *r;
auto struct stk {
char *l;
char *r;
} stack[16];
struct stk *sp;
sp = stack;
r = (char *) base + (nmemb-1)*size;
for (;;) {
do {
x = (char *)base + (r - (char *) base) / size / 2 * size;
i = base;
j = r;
do {
while ((*compar)((const void *) i, (const void *) x) < 0)
i += size;
while ((*compar)((const void *) x,(const void *) j) < 0)
j -= size;
if (i < j) {
swapmem(i, j, size);
if (i == x)
x = j;
else
if (j == x)
x = i;
}
if (i <= j) {
i += size;
j -= size;
}
} while (i <= j);
if (j-(char *)base < r-i) {
if (i < r) { /* 오른쪽 위치 스택 삽입 */
sp->l = i;
sp->r = r;
++sp;
}
r = j; /* 왼쪽 위치 정렬 계속 */
}
else {
if ((char *) base < j) { /* 왼쪽 위치 스택 삽입 */
sp->l = base;
sp->r = j;
++sp;
}
base = i; /* 오른쪽 위치 정렬 계속 */
}
} while ((char *) base < r);
if (sp <= stack) break;
--sp;
base = sp->l;
r = sp->r;
}
}
/* qsort example */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char list[5][4] = { "cat", "car", "cab", "cap", "can" };
int sort_function( const void *a, const void *b)
{
return( strcmp((char *)a,(char *)b) );
}
int main(void)
{
int x;
qsort((void *)list, 5, sizeof(list[0]), sort_function);
for (x = 0; x < 5; x++)
printf("%s\n", list[x]);
return 0;
}