본문 바로가기
자료구조와 알고리즘

버블 정렬

by 매트(Mat) 2023. 3. 18.

Bubble Sort (버블 정렬)

버블 정렬은 정렬 알고리즘 중 하나로, 거품 정렬이라고도 한다. 또한 구현해보면 알겠지만 버블 정렬은 코드가 정말 단순하다. 그래서 자주 사용된다.

버블 정렬 개념

  • O(n^2)의 상당히 느린 시간복잡도를 갖느다.
  • 코드가 단순하기 때문에 자주 사용되며, 원소의 이동이 거품이 수면으로 올라오는 듯한 모습을 보이기 때문에 지어진 이름이다. 이를 양방향으로 번갈아 수행하면 칵테일 정렬이 된다.

버블 정렬 알고리즘

  • 서로 인접한 두 원소를 검사하여 정렬하는 알고리즘
    • 인접한 두 원소가 정렬이 안되어 있으면 두 원소를 swap하고, 정렬이 되어있으면 그대로둔다.
  • 서로 인접한 두 원소를 배열의 마지막 원소까지 비교해나가다 보면 결국에 마지막 원소가 자리를 잡게 된다. 이렇게 한 사이클이 1회이다.
  • 이 알고리즘을 배열이 모두 정렬될 때까지 즉, 배열에 아무런 변화가 없을 때까지 반복한다.
  • 포인트는 1회가 끝나면 마지막 원소는 자리를 잡게 된다. 다음으로 2회가 끝나면 마지막에서 2번째 원소가 자리르 잡게 된다. 즉, 매회가 끝날 때마다 반복 수가 하나씩 줄어드는 것을 알 수 있다.

bubblesort1

버블 정렬 구현하기

재귀 사용

package com.azurealstn.algorithm.try1.sort;

public class BubbleSortTest {
    private static void bubbleSort(int[] arr) {
        bubbleSort(arr, arr.length - 1); //재귀적으로 호출
    }

    private static void bubbleSort(int[] arr, int last) {
        if (last > 0) { //마지막 인덱스가 0보다 클 때까지 반복
            for (int i = 1; i <= last; i++) {
                if (arr[i - 1] > arr[i]) {
                    swap(arr, i - 1, i);
                }
            }
            bubbleSort(arr, last - 1); //반복되는 수는 마지막 인덱스에서 하나씩 줄어든다.
        }
    }

    private static void swap(int[] arr, int source, int target) {
        int tmp = arr[source];
        arr[source] = arr[target];
        arr[target] = tmp;
    }

    private static void printArray(int[] arr) {
        for (int data : arr) {
            System.out.print(data + " ");
        }
        System.out.println();
    }

    public static void main(String[] args) {
        int[] arr = {3, 5, 4, 2, 1};
        printArray(arr);
        bubbleSort(arr);
        printArray(arr);
    }
}

2중 for문 사용

package com.azurealstn.algorithm.try1.sort;

public class BubbleSortTest {
    private static void bubbleSort(int[] arr) {
        for (int i = 0; i < arr.length - 1; i++) {
            for (int j = 1; j < arr.length - i; j++) { //반복수가 1개씩 줄어든다.
                if (arr[j - 1] > arr[j]) {
                    swap(arr, j - 1, j);
                }
            }
        }
    }

    private static void swap(int[] arr, int source, int target) {
        int tmp = arr[source];
        arr[source] = arr[target];
        arr[target] = tmp;
    }

    private static void printArray(int[] arr) {
        for (int data : arr) {
            System.out.print(data + " ");
        }
        System.out.println();
    }

    public static void main(String[] args) {
        int[] arr = {3, 5, 4, 2, 1};
        printArray(arr);
        bubbleSort(arr);
        printArray(arr);
    }
}

References

'자료구조와 알고리즘' 카테고리의 다른 글

AVL 트리  (0) 2024.02.04
덱(Deque)  (0) 2024.02.03
병합 정렬(Merge Sort)  (0) 2023.03.17
퀵 정렬, 퀵하게 알아보자.  (0) 2023.03.16
ArrayList 개념에 대해 알아볼게요.  (0) 2023.03.11

댓글