정보공간_1

[4기 대구 하호성] search.h에 있는 정렬함수 만들기 본문

IT 놀이터/Elite Member Tech & Talk

[4기 대구 하호성] search.h에 있는 정렬함수 만들기

알 수 없는 사용자 2013. 12. 5. 23:06

안녕하세요.
대구멤버십 22-1기 하호성입니다.
C언어 정렬 알고리즘을 일반화 하는 방법에 대해 공부하다가
다 같이 공유하고 싶어 글을 남깁니다.

 

C언어의 헤더파일 중 SEARCH.H 가 있습니다.
이 헤더파일에 퀵 소트 qsort 함수가 있는데
일반화 돼 있어 원하는 자료를 원하는 비교 함수로 sorting을 할 수 있습니다.


search.h에 있는 qsort의 프로토타입은 다음과 같습니다.


위 프로토타입의 전처리기 문을 제거하구 보기 좋게 정리하면


_Base : 배열의 시작점을 알리는 주소
_NumOfelements : 배열에 있는 알맹이의 개수
_SizeOfElements : 알맹이의 크기(sizeof(알맹이))
_PtFuncCompare : 정렬할 때 쓸 비교함수

위와 같은 프로토타입으로 bouble sort를 만들어 보았습니다.

void __cdecl mysort(int *_Base, size_t _NumOfElements, size_t _SizeOfElements, int (_cdecl* _PtFuncCompare)(const void *x, const void *y))
{
 int i, j;
 for( i=0 ; i<_NumOfElements ; i++ )
  for( j=i+1 ; j<_NumOfElements ; j++ )
   if( _PtFuncCompare((char*)_Base+(i*_SizeOfElements), (char*)_Base+(j*_SizeOfElements)) )
    myswap((char*)_Base+(i*_SizeOfElements), (char*)_Base+(j*_SizeOfElements), _SizeOfElements);
}


i번째 알맹이에 대한 주소입니다. ((char*)_Base+(i*_SizeOfElements)
기존 배열의 첫 번째 알맹이의 주소에 (알맹이의 크기 * 건너뛸 i) 만큼 더해주었습니다.
1바이트 단위로 주소 연산을 할 수 있게 하기 위해 char *로 캐스팅합니다.


swap함수입니다.


알맹이의 크기만큼 값을 swap합니다.

완성된 소스코드와 예제입니다.
방금 만든 mysort와 search.h에 있는 qsort에 들어간 함수인자를 똑같이 하고
같은 데이터를 정렬합니다.

결과화면

 

이상 포스팅을 마칩니다.