티스토리 툴바


오늘은 가장 단순, 무식한 알고리즘인 거품 정렬에 대해 알아 보도록 하겠습니다.

▶ 선택 정렬 (Selection Sort)
▶ 삽입 정렬 (Insert Sort)
▶ 거품 정렬 (Bubble Sort)
▶ 퀵 정렬 (Quick Sort)
▶ 힙 정렬 (Heap Sort)

3. 거품 정렬
거품 정렬은 알고리즘을 통한 정렬 과정이 거품이 보글보글 올라오는 것과 같다고 해서 거품 정렬이라는 이름이 붙여졌습니다.

정렬 알고리즘 중 가장 단순하고, 느리다고 알려져 있는데 그럼 정말 그런지 살펴 볼까요?


            ↓ 배열 포인터 (array[0])
          | 3 | 4 | 2 | 1 |

1. i = 0 이며, i 가 n-1이 되면 종료된다.

2. 현재 배열 포인터와 다음 포인터의 값을 비교하여 array[j] > array]j + 1] 라면 두 값을 교환한다.

i = 0, j = 0;
            ↓ 배열 포인터 (array[j])
          | 3 | 4 | 2 | 1 |

i = 0, j = 1;
                ↓ 배열 포인터 (array[j])
          | 3 | 2 | 4 | 1 |

i = 0, j = 2;

                     ↓ 배열 포인터 (array[j])
          | 3 | 2 | 4 | 1 |

i = 0, j = 3;

                          ↓ 배열 포인터 (array[j])
          | 3 | 2 | 1 | 4 |

3. j 가 n - i 이면, j = 0 으로 하고, i 를 1만큼 증가시킨다.

i = 1, j = 0;

           ↓ 배열 포인터 (array[j])
          | 2 | 3 | 1 | 4 |

i = 1, j = 1;

                ↓ 배열 포인터 (array[j])
          | 2 | 3 | 1 | 4 |

i = 1, j = 2;

                     ↓ 배열 포인터 (array[j])
          | 2 | 1 | 3 | 4 |

4. 3 단계를 반복한다.

i = 2, j = 0;

            ↓ 배열 포인터 (array[j])
          | 2 | 1 | 3 | 4 |
 

i = 2, j = 1;

                ↓ 배열 포인터 (array[j])
          | 1 | 2 | 3 | 4 |
 

5. i 가 n - 1 이면 정렬을 종료한다.

정말 거품이 보글보글 올라가는 모습이 보이시나요? 

자세히 보면 끝에서 부터 차례로 정렬이 되는 모습을 확인 하실 수 있습니다. 그래서 거품이 조금씩 작아지는 것이죠.

n 개의 데이터를 정렬하기 위해서는 n + (n - 1) + (n - 2).....  번의 비교 과정과 일련의 교환 과정이 수행되어야 합니다. 

교환 과정을 제외한 비교는 n(n - 1)/2 번을 수행하게 됩니다. 따라서 복잡도는 O(n2) 입니다.

따라서 실행시간은 느리다는 것을 알 수 있습니다.

그럼 코드를 살펴보도록 하겠습니다.


#include <stdio.h>


#define LEN 4

#define SWAP(a, b) { int t = a; a = b; b = t; }


void bubble_sort(char array[], int n)

{

    int i=0, j;

    for (; i < n - 1; i++) {

        for (j=0; j < n - (i + 1); j++) {

            if (array[j] > array[j+1]) {

                SWAP(array[j], array[j+1]);

            } // if

        } // for

    } // for

}

int main(void)

{

    char array[LEN]={3, 4, 2, 1};

    char i=0;



    printf("before:");


    for (; i < LEN; i++)

        printf(" %d", array[i]);


    printf("\n");


    bubble_sort(array, LEN);


    printf("after:");


    for (i=0; i < LEN; i++)

        printf(" %d", array[i]);


    printf("\n");


    return 0;

}


별도의 추가적인 코멘트는 달지 않도록 하겠습니다.

크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by locker K군