Programing/C- programing

C-Library qsort() 퀵 정렬 함수

sosal 2010. 8. 22. 20:59
반응형

/*
 http://sosal.tistory.com/
 * made by so_Sal
 */



#include<stdlib.h>
   void qsort(void *base,         // 데이터 집합 배열의 주소
                  size_t nmemb,    // 데이터 요소의 개수
                  size_t size,         // 각 배열 하나 원소의 크기
                  int(*compare)(const void *, const void *) //비교 함수에 대한 포인터
           );

(gcc man-page 내용이므로, visual studio 함수 원형의 매개변수 이름과 다를 수 있습니다.)

base : 배열의 이름, 즉 데이터 집합 배열의 주소를 받는 매개변수
nmemb : 배열에서 정렬하고자 하는 원소의 갯수
size : 각 원소의 자료형 크기

여기까진 쉬운데, 마지막 매개변수는 뭘까요?
비교를 수행한 결과를 반환하는 함수에 대한 포인터입니다!.

int compare(const void *element1, const void *element2);
element1이 element2보다 크다면 0보다 큰 수를, 같다면 0, 작다면 -를 반환하면 됩니다.
만약 int가 아닌 다른 자료형이라면, 사용자가 직접 정렬해야겠죠?


#include<iostream>
#include<stdlib.h>
#include<ctime>
using namespace std;

int compare(const void *a, const void *b)
{
        return *(int *)a - *(int *)b; //크면 양수, 작으면 음수 리턴
}

int main(){
    int a[30];
    srand(time(0));
    for(int i=0;i<15;i++)
        a[i] = rand()%100;
    for(int i=0;i<15;i++)
        printf("%d  ",a[i]);
    cout<<endl;                //랜덤으로 배열을 만든 후 출력

    qsort((void*)a,15,sizeof(int),compare); //정렬

    for(int i=0;i<15;i++)
        printf("%d  ",a[i]); //정렬된 배열 출력
    cout<<endl;
    return 0;
}