본문 바로가기

프로그래밍/C/C++

퀵소트 소스,Quick Sort source.참고

 

/*--------------------------------------------------------------------------*/
/* 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;
}