C++ 약간 알고, 주로 자바 프로그래밍을 하는 사람입니다. 요새 C로 뭘 짤일이 생겼는데, 정렬 알고리즘이 필요해서 하나 짰습니다. 그런데 문제는...이거 타입이 바뀌면 일일이 다시 짜야하는건가요?
C++ 이라면 템플릿을 사용하면 되고, 자바라면 5.0 에 추가된 제너릭을 사용하거나 아님 캐스팅으로 해결할 수 있는데, C에서는 어떻게 할지 모르겠습니다.
일단 int 배열을 정렬하도록 짰는데, double 을 정렬하려니 이거 다시 짜는 것 밖에는 방법이 없어보이네요. void 포인터를 사용하는 방법도 생각해봤지만 매번 포인터를 사용해 간접적으로 접근하는 것은 효율에 문제가 있을 것 같아서요. 제법 큰 배열을 자주 정렬해야하기 때문에 효율 문제가 중요합니다. 정렬 말고도 C++ 벡터, 자바의 ArrayList 같은 녀석도 있으면 좋겠어서 int 에 대해 하나 짰는데 이것도 도무지 다른 타입으로 확장할 방법이 안보이는군요...
C를 주로 사용하시는 분들은 어떻게 처리하는지 궁금합니다.


=======================================================================================

매크로를 쓰시면 됩니다.

다음은 wikipedia에 있는 버블소트 pseudocode입니다.

procedure bubbleSort( A : list of sortable items ) defined as:
do
swapped := false
for each i in 0 to length( A ) - 2 do:
if A[ i ] > A[ i + 1 ] then
swap( A[ i ], A[ i + 1 ] )
swapped := true
end if
end for
while swapped
end procedure

C로 하면
void bsort(int* A, size_t sz)
{
int swapped;
int temp;
size_t i;
do {
swapped = 0;
for (i=0; i < sz-1; ++i) {
if (A[i] > A[i+1]) {
temp = A[i];
A[i] = A[i+1];
A[i+1] = temp;
swapped = 1;
}
}
} while (swapped);
}

얘를 다시 매크로로 하면
#define BSORT(type)\
void bsort_##type(type* A, size_t sz)\
{\
int swapped;\
type temp;\
size_t i;\
do {\
swapped = 0;\
for (i=0; i < sz-1; ++i) {\
if (A[i] > A[i+1]) {\
temp = A[i];\
A[i] = A[i+1];\
A[i+1] = temp;\
swapped = 1;\
}\
}\
} while (swapped);\
}
 
BSORT(int)
BSORT(double)
...
 
int main()
{
bsort_int(xx, sizeof(xx)/sizeof(xx[0]));
bsort_double(xxx, sizeof(xxx)/sizeof(xxx[0]));
return 0;
}


WRITTEN BY
RootFriend
개인적으로... 나쁜 기억력에 도움되라고 만들게되었습니다.

,