본문 바로가기

BackEnd/C

버블 정렬 (Bubble Sort)의 이해와 함수 포인터 기반의 함수 정의

반응형

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]={3214};
    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]={3214};
    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 


함수는 내림차순 정렬을 하게 된다. 


이 예제를 통해서 함수 포인터가 어떻게 유용하게 활용될 수 있는지 확인하였다. 


반응형