1. 버블 정렬의 개념
함수 포인터를 활용하기에 앞서 버블정렬의 개념이 필요한데 아래 링크에서 개념을 참고하자.
https://cg-developer.tistory.com/141
2. 버블정렬의 구현
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | #include <stdio.h> void BubbleSort(int ary[], int len); int main(void) { int arr[4]={3, 2, 1, 4}; int i; BubbleSort(arr, sizeof(arr)/sizeof(int)); for(i=0; i<4; i++) printf("%d ", arr[i]); printf("\n"); return 0; } void BubbleSort(int ary[], int len) { int i, j; int temp; for(i=0; i<len-1 ;i++) { for(j=0; j<(len-i)-1; j++) { if(ary[j]>ary[j+1]) { temp=ary[j]; ary[j]=ary[j+1]; ary[j+1]=temp; } } } } | cs |
1 | 1 2 3 4 | cs |
3. 오름차순 정렬과 내림차순 정렬이 모두 필요하다면?
가장 일반적인 방법은 위 예제 18행에 정의되어 있는 BubbleSort 함수의 이름을 달리해서 내림차
순 정렬 방식으로 하나 더 구현하는 것이다. 그런데 이러한 방식 이외에도 BubbleSort 함수가 오름
차순으로도 정렬을 할 수 있고, 내림차순으로도 정렬을 할 수 있도록 함수 자체에 유연성을 부여하
는 방법도 고려할 수 있다.
일단 다음 예제를 보자.
다만 함수 포인터를 이용해서 BubbleSort 함수에 유연성을 부여했을 뿐이다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | #include <stdio.h> int ACDSort(int n1, int n2); int DSDSort(int n1, int n2); void BubbleSort(int ary[], int len, int (*sortFunc)(int,int)); int main(void) { int arr[4]={3, 2, 1, 4}; int i; BubbleSort(arr, sizeof(arr)/sizeof(int), ACDSort); for(i=0; i<4; i++) printf("%d ", arr[i]); printf("\n"); BubbleSort(arr, sizeof(arr)/sizeof(int), DSDSort); for(i=0; i<4; i++) printf("%d ", arr[i]); printf("\n"); return 0; } int ACDSort(int n1, int n2) // 오름차순 정렬의 KEY { if(n1>n2) return 1; else return 0; } int DSDSort(int n1, int n2) // 내림차순 정렬의 KEY { if(n1<n2) return 1; else return 0; } void BubbleSort(int ary[], int len, int (*sortFunc)(int,int)) { int i, j; int temp; for(i=0; i<len-1 ;i++) { for(j=0; j<(len-i)-1; j++) { if(sortFunc(ary[j], ary[j+1])) { temp=ary[j]; ary[j]=ary[j+1]; ary[j+1]=temp; } } } } | cs |
1 2 | 1 2 3 4 4 3 2 1 | cs |
50행 : 여기서 호출하는 sortFunc 함수는 BubbleSort 함수의 세 번째 전달인자다. 그리고 sortFunc 함수
가 0이 아닌 값을 반환하면 저장된 값의 교환이 이뤄지고, 0을 반환하면 값의 교환이 이뤄지지 않는 것
을 알 수 있다. 즉 정렬의 기준은 BubbleSort 함수의 세 번째 인자로 전달되는 함수가 1을 반환하는 기
준에 따라 달라진다.
25행 : ACDSort 함수는 첫 번째 전달인자인 n1에 저장된 값이 n2보다 클 때,1이 반환되도록 정의되
어 있다. 따라서 이 함수의 주소 값이 BubbleSort 함수의 세 번째 인자로 전달되면, BubbleSort 함수는
오름차순 정렬을 하게 된다.
33행 : 반면 DSDSort 함수는 첫 번째 전달인자인 n1에 저장된 값이 n2보다 작을 때, 1이 반환되도 록
정의되어 있다. 따라서 이 함수의 주소 값이 BubbleSort 함수의 세 번째 인자로 전달되면, BubbleSort
함수는 내림차순 정렬을 하게 된다.
이 예제를 통해서 함수 포인터가 어떻게 유용하게 활용될 수 있는지 확인하였다.
'BackEnd > C' 카테고리의 다른 글
puts,putchar,gets,getchar 함수와 버퍼 (0) | 2019.03.19 |
---|---|
함수 포인터를 인자로 요구하는 표준 함수들(atexit, qsort, bsearch) (0) | 2019.03.18 |
함수 포인터(Function Pointer) (0) | 2019.03.18 |
main 함수로의 문자열 전달 (0) | 2019.03.16 |
메모리 컨트롤 함수 (0) | 2019.03.16 |