ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • C언어 qsort(), bsearch()
    Visual Studio/C 기초 2013. 9. 1. 23:06

    프로그램에서 수행되는 가장 흔한 작업은 데이터 검색과 정렬입니다. 따라서 중요한 내용이죠.

    먼저 bsearch()는 데이터의 배열에서 검색 키에 일치하는 배열 요소를 찾기 위해 바이너리 검색을 수행합니다.

    bsearch()를 사용하기 위해서는 배열을 오름차순으로 정렬해야 합니다.

    또한 프로그램에서는 하나의 데이터 항목이 다른 항목보다 큰지, 작은지, 같은지를 결정하기 위해 bsearch() 함수에 의해 사용되는 비교 함수를 제공해야합니다. stdlib()에 정의되어 있습니다.

     

    void *bsearch(void *key, void *base, size_t num; size_t width, int (*cmp)(void *element1, void*element2)); 

    ... 굉장히 복잡한 함수라서 주의해서 살펴봐야 합니다. key는 검색하기 원하는 데이터 항목에 대한 포인터이고 base는 검색할 배열의 첫 번째 요소에 대한 포인터입니다. 이 둘 다 void형 포인터로 선언됩니다.

    num은 배열에 있는 요소의 수이고 width는 바이트 단위로 표현되는 각 요소의 크기입니다. size_t는 sizeof()연산자가 돌려주는 데이터형을 뜻하는 것으로 unsigned형입니다.

    cmp는 비교 함수에 대한 포인터 입니다. 이 함수는 사용자 정의 함수가 될 수 있고 문자열 데이터를 검색할 때에는 라이브러리 함수 strcmp()를 사용할 수 있습니다. 비교 함수는 아래와 같이 두 가지 기준에 적합해야 합니다.

    1. 함수에는 2개의 데이터 항목에 대한 포인터가 전달된다.

    2. <0 : 첫 번째 요소가 두 번째 요소보다 작다.

       0 : 첫 번째 요소와 두 번째 요소가 같다.

       >0 : 첫 번째 요소가 두 번째 요소보다 크다.

     

    그 다음 qsort()입니다. 이 함수를 수행한 결과는 대부분 오름차순이지만 qsort()는 내림차순으로 정렬할 수도 있습니다. 

     void qsort(void *base, size_t num, size_t size, int (*cmp)(void *element1, void *element2));

    이 함수도 복잡하네요. bsearch()와 동일합니다.

    예제를 보겠습니다.

     

    #include <stdio.h>
    #include <stdlib.h>

    #define MAX 20

    int intcmp(const void *v1, const void *v2);

    main()
    {
     int arr[MAX], count, key, *ptr;
     printf("int형 정수를 입력해주세요 :");
     for(count=0;count<MAX;count++)
      scanf("%d",&arr[count]);

     puts("정렬하기 위해 enter를 눌러주세요.");
     getc(stdin);

     qsort(arr, MAX, sizeof(arr[0]), intcmp);
     for(count=0;count<MAX;count++)
      printf("arr[%d] = %d\n", count, arr[count]);

     puts("계속하기 위해 엔터를 눌러주세요.");
     getc(stdin);

     printf("검색할 값을 입력해주세요 :");
     scanf("%d",&key);
     ptr=(int *)bsearch(&key, arr, MAX, sizeof(arr[0]), intcmp);
     if(ptr!=NULL)
      printf("arr[%d]에서 %d를 찾았습니다.\n",(ptr-arr),key);
     else
      printf("%d를 찾지 못했습니다.\n",key);
    }

    int intcmp(const void *v1, const void *v2)
    {
     return(*(int *)v1 - *(int *)v2);

     

    'Visual Studio > C 기초' 카테고리의 다른 글

    C언어 calloc()  (0) 2013.09.10
    C언어 malloc()  (0) 2013.09.06
    C언어 시간 처리 함수  (0) 2013.09.01
    C언어 strftime() 변환 문자 표  (0) 2013.09.01
    C언어 가변적인 함수 va_list, va_start(), va_arg(), va_end()  (6) 2013.08.19

    댓글

Designed by Tistory.