Bubble Sort


Bubble Sort


숫자로 된 배열을 오름차순이나 내림차순으로 정렬하는 알고리즘입니다.

방식은 간단합니다.


만약 {22, 39, 33, 21, 31} 이 배열을 정렬한다면

0번째 숫자(22)와 1번째 숫자(39)를 비교합니다.

22 < 39 이므로 뒤의 숫자가 더 크니 아무일도 일어나지 않습니다.


다음으로 1번째 숫자(39)와 2번째 숫자(33)을 비교합니다.

이번엔 39 > 33 으로 앞의 숫자가 더 크네요.

이럴 때는 39와 33의 자리를 바꿔줍니다. 그럼 배열은

{22, 33, 39, 21, 31} 이 되겠죠.


다음으로 2번째 숫자(39)와 3번째 숫자(21)을 비교합니다.

39 > 21 로 앞의 숫자가 더 크므로 이번에도 자리를 바꿔줍니다.

{22, 33, 21, 39, 31} 이 되겠죠.


다음으로 3번째 숫자(39)와 4번째 숫자(31)을 비교합니다.

39 > 31 로 앞의 숫자가 더 크므로 자리를 바꿔줍니다.

{22, 33, 21, 31, 39} 가 되겠죠.


이게 한번 로테이션입니다.

한번 로테이션 결과를 보면 가장 큰 숫자가 맨 뒤로 갔음을 알 수 있습니다.

두번째 로테이션에서는 맨 뒤로간 39를 제외하고 {22, 33, 21, 31} 사이에서

앞의 방법과 같은 방법으로 정렬을 해줍니다.

그럼 두번째 로테이션에서 가장 마지막으로 가는 숫자는 33이 되겠죠.


이런 식으로 각 로테이션 마다 가장 큰 숫자를 맨 뒤로 보내는 방식이

Bubble Sort 입니다.

이렇게 자리가 바뀌는 과정이 거품이 움직인거 같다나 뭐라나…




복잡도(Time Complexity)


위에서 설명한 예를 사용하겠습니다.

5개의 숫자가 있습니다.

첫번째 로테이션에서 비교 연산은

0번째숫자-1번째숫자, 1번째숫자-2번째숫자, 2번째숫자-3번째숫자, 3번째숫자-4번째숫자

이렇게 4번 일어났습니다.


두번째 로테이션에서 비교연산은

0번째숫자-1번째숫자, 1번째숫자-2번째숫자, 2번째숫자-3번째숫자

이렇게 3번 일어났습니다.


같은 방식으로

3번째 로테이션에선 2번, 4번째 로테이션에선 1번 일어났습니다.

즉, 5개의 숫자를 정렬하는데 (4+3+2+1)번의 연산이 일어났습니다.


그럼 만약 n개의 숫자를 정렬한다면 연산 횟수는

\[1+2+3+ \cdots + (n-1) = \sum_{i=0}^n i = \frac{n(n-1)}{2}\]

즉, \(O(n^2)\) 입니다.




예제 코드


BubbleSort.java

import java.util.Random;

public class BubbleSort {
    public static void main(String[] ar){
        BubbleSort ex = new BubbleSort();

        int arraySize = 5;

        int[] intArray = new int[arraySize];
        Random rand = new Random();

        for(int loop=0; loop<arraySize; loop++){
            intArray[loop] = rand.nextInt(50) + 1;
        }

        System.out.print("New array => ");

        ex.printArray(intArray);
        System.out.println();
        System.out.println("Bubble sort START!!!");
        ex.printArray(intArray);
        ex.doBubbleSort(intArray);
    }

    public void doBubbleSort(int[] inputArray){
        int[] array = inputArray;
        int arraySize = array.length;
        int temp;

        for(int loop=0; loop<arraySize-1; loop++){
            System.out.println((loop+1) + "th sorting process");
            for(int loop2=0; loop2<arraySize-loop-1; loop2++){

                if(array[loop2] > array[loop2+1]){
                    temp = array[loop2];
                    array[loop2] = array[loop2+1];
                    array[loop2+1] = temp;

                    // array 출력
                    printArray(array);
                }


            }

        }
    }

    public void printArray(int[] inputArray){
        for(int item: inputArray){
            System.out.print(item + " ");
        }
        System.out.println();
    }
}

//New array => 26 46 20 15 14
//
//    Bubble sort START!!!
//    26 46 20 15 14
//    1th sorting process
//    26 20 46 15 14
//    26 20 15 46 14
//    26 20 15 14 46
//    2th sorting process
//    20 26 15 14 46
//    20 15 26 14 46
//    20 15 14 26 46
//    3th sorting process
//    15 20 14 26 46
//    15 14 20 26 46
//    4th sorting process
//    14 15 20 26 46 

가장 밑에 주석으로 쓴 부분이 출력 결과(진행 과정)입니다.

1~50 사이의 숫자를 랜덤으로 받아 배열을 만들었고,

doBubbleSort()에서 버블소트를 진행하였습니다.

참고로 1st, 2nd, 3rd 인건 알지만,

그게 메인이 아니고, 그거까지 구현하면 코드가 지저분해질 것 같아서

대충 th로 통일하였습니다.