#include
#include
int comp(const void *i,const void *j);
int main()
{
int sort[100],i;
for(i=0;i<100;i++)sort[i]=rand();
qsort(sort,100,sizeof(int),comp);
for(i=0;i<100;i++)printf("%d\n",sort[i]);
return 0;
}
int comp(const void *i,const void *j)
{
return *(int *)i-*(int *)j;
}
소스는 다음과 같습니다. 처음에 sort배열에 임의의 수 100개를 채운다음 퀵정렬 내장함수인 qsort()를 호출하여 sort배열이 어떻게 오름차순으로 정렬이 되는지 그것을 이해 못하겠습니다. 참고로 제가 이해한 것을 말씀드리자면 퀵정렬이 무엇인지 알고 있고 qsort에서 sort는 정렬될 배열을 가리키고 100은 배열의 크기 sizeof(int)는 배열의 각 원소의 크기라는 것과 comp에서 두원소를 비교한다는 것을 알겠는데 comp함수에서 i가 가리키는 값보다 j가 가리키는 값이 더 클 경우 음수를 , 같으면 0, 작으면 양수값을 반환해 준다는데 어떻게 이 반환값들 만으로 정렬이 되는 것인지 모르겠습니다. 그리고 i와 j는 정확히 sort의 몇번째 원소를 가리키도록 초기화가 되고 어떤 식으로 돌아가는것인지 이해를 못하겟네요
comp 함수는 값이 같으면 0 을 다를 경우 음수와 양수를 return 합니다.
return 되는 값으로 어떤값이 큰지 알수 있습니다.
즉 qsort 함수내부에는 2개의 값을 비교하는 부분이 있습니다.
그런데 이 부분을 바깥에서 프로그램 하도록 만들었습니다.
그것이 comp 함수처럼 구현하는 것입니다.
즉 qsort 함수에서 2개의 값을 던져주고 앞의 값이 뒤의 값보다 클때,
작을 때의 처리 부분이 있습니다. 단지 큰지 작은지의 값을 외부함수에서
가져오도록 설계 한 것입니다.
그래서 qosrt 함수가 return 되는 값에 때라 반응하기 때문에 오름차순, 내림차
순으로 우리는 프로그램할 수 있는 것입니다.
예를 들어 comp 함수가 내림차순으로 정렬되는 형태라면 return 되는 값의
부호만 바꾸게 되면 오름차순으로 정렬되는 것 입니다.
그런데 문제는 정렬하는 형태가 일정하지 않습니다. 어떤 사람들은
int 값을 정렬할때가 있을 것이고, 어떤 사람들은 구조체를 정렬할려고 하는
사람도 있을 것 입니다.
그래서 외부 함수는
int Function_Name( const *void v1, const *void v2 )
형태로 고정되어 있습니다. void 란 의미는 없다는 뜻이 아니라 형태가 없다는
뜻 입니다. 즉 아무형태나 모두 가능하다는 의미 입니다.
그래서 qsort 내부에서 외부함수를 호출할 때 qsort 함수 call 할때 지정한
한 원소의 크기별로 v1, v2 에 보내주게 됩니다.
그래서 함수내부에서는 그것을 cast 연산자를 사용하여 값을 변환하여
coding 해야 합니다. 위의 comp 함수는 int 형인것 같군요.
comp 함수를 자세히 보면
int comp(const void *i,const void *j)
{
int v1 = (int)*i;
int v2 = (int)*j;
return v1-v2;
}
형태가 될 것 입니다.
버블 소트를 예를 든다면
int a[b];
for( i = 0; i < n-1; i++ )
{
for( j = 0; j < n-1; j++ )
{
if( a[j] > a[j+1] )
Swip( &a[j], &a[j+1] );
}
}
의 형태가 될 것입니다.
이것을 변형하면
int a[b];
for( i = 0; i < n-1; i++ )
{
for( j = 0; j < n-1; j++ )
{
if( Comp(&a[j], &a[j+1]) > 0 )
Swip( &a[j], &a[j+1] );
}
}
의 형태가 되는 것입니다.
즉 if 문을 바깥으로 빼서 함수에서 비교하도록 했습니다.
이런 식으로 구현이 되어 있는 것입니다.
도움이 되시길 ....
댓글