[정렬 알고리즘, C#] 버블 정렬(Bubble Sort)

2025. 6. 17. 17:49·Unity,C#/알고리즘
728x90

■ 버블 정렬(Bubble Sort)

버블 정렬이란 이름은 큰 값이 뒤로 떠오르는 모습이 마치 물속에서 거품(버블)이 위로 올라가는 것처럼 보인다는 데서 유래된 이름이다.

[버블 정렬의 원리]

버블 정렬은 인접한 두 개의 원소를 비교하는 방식으로 정렬을 수행한다. 현재 탐색 중인 요소의 인덱스 번호를 $n$이라 한다면,

  1. arr[n] > arr[n+1] 이라면, 두 원소의 값을 서로 교환한다. (오름차순 정렬 기준)
  2. 위 비교는 “$n + 1 <$ 배열의 길이 - 현재 회차 - 1”을 만족하는 동안 반복된다.

즉, 첫 번째 반복이 끝나면 배열에서 가장 큰 값이 맨 뒤에 위치하게 된다. 두 번째 반복이 끝나면 두 번째로 큰 값이 그 앞자리에 위치하게 된다.

  • 이렇게 반복이 진행될수록 가장 큰 값이 점차 뒤쪽으로 이동하게 되는 알고리즘이다.

 

■ 버블 정렬 구현(C#)

버블 정렬의 구현 방법은 매우 간단하다.

이중 for문을 사용해서 구현하며, 가장 바깥쪽 반복문이 한 번 수행될 때마다 가장 큰 값이 배열의 끝으로 이동하게 된다.

public static class SortArray<T> where T : IComparable<T>
{
    // 버블 정렬
    public static void BubbleSort(T[] arr)
    {
        for(var i = 0; i < arr.Length - 1; ++i)
        {
            for(var j = 0; j < arr.Length - i - 1; ++j)
            {
                if (arr[j].CompareTo(arr[j + 1]) > 0)
                {
                    var temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
        }
    }
}

위 구현에선 제너릭 형식을 사용하여, 모든 비교 가능한 타입(IComparable 인터페이스를 구현한 타입)에 대해 정렬이 가능하도록 했다.

버블 정렬은 매 반복 회차마다 가장 큰 값을 뒤로 보내는 방식이기 때문에, 이미 정렬이 완료된 요소는 이후 비교 대상에서 제외해도 된다.

  • 안쪽 반복문의 조건을 j < arr.Length - i - 1로 설정하여, 매 회차마다 비교 범위를 줄여 나간다.

 

▶ 버블 정렬의 시간복잡도

버블 정렬은 이중 for문으로 구성되어 있는데, 바깥쪽 반복문은 입력 데이터의 개수$(n)$만큼 반복된다. 반면 안쪽 반복문은 반복이 진행될수록 실행 횟수가 점차 줄어드는($n-m$) 구조를 가지고 있다.

  • $i = 0$ 이면, $j$는 0부터 $n-1$까지 ⇒ 총 $n-1$회 실행.
  • $i = 1$ 이면, $j$는 0부터 $n-2$ 까지 ⇒ 총 $n-2$회 실행.
  • ……
  • $i = n-2$ 이면, $j$는 0부터 0까지 ⇒ 총 1회 실행.

그렇다면, 총 반복 횟수는 다음과 같이 계산 가능하다.

$$ (n-1) + (n-2) + (n-3) + ... + 1 = \frac{n(n-1)}{2} = \frac{n^2 -n}{2} $$

[등차수열의 합 공식]

 

하지만 빅-오 표기법에선? 가장 영향력이 큰(최고 차항의 계수)만 고려하므로, 버블 정렬의 시간복잡도는 결국 $O(n^2)$이 된다.

728x90

'Unity,C# > 알고리즘' 카테고리의 다른 글

[정렬 알고리즘, C#] 삽입 정렬(Insertion Sort)  (0) 2025.06.17
[정렬 알고리즘, C#] 선택 정렬(Selection Sort)  (0) 2025.06.17
[C#, Unity, 최단경로(PathFinding)] TileMap A* 알고리즘  (0) 2025.04.10
[C#, Unity, 최단경로(PathFinding)] TileMap 다익스트라(Dijkstra) 알고리즘  (0) 2025.04.10
[C#, Algorithm] Dynamic Programming(동적 계획법)  (0) 2025.04.10
'Unity,C#/알고리즘' 카테고리의 다른 글
  • [정렬 알고리즘, C#] 삽입 정렬(Insertion Sort)
  • [정렬 알고리즘, C#] 선택 정렬(Selection Sort)
  • [C#, Unity, 최단경로(PathFinding)] TileMap A* 알고리즘
  • [C#, Unity, 최단경로(PathFinding)] TileMap 다익스트라(Dijkstra) 알고리즘
브라더스톤
브라더스톤
유티니, C#과 관련한 여러 정보를 끄적여둔 블로그입니다. Email : dkavmdk98@gmail.com
  • 브라더스톤
    젊은 프로그래머의 슬픔
    브라더스톤
  • 전체
    오늘
    어제
    • 개발 노트 (26)
      • Unity,C# (26)
        • Unity 정보 (5)
        • 알고리즘 (10)
        • 자료구조 (2)
        • 절차적생성(PCG) (9)
      • C++ (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    알고리즘
    절차적지형생성
    커스텀 인스펙터
    자료구조
    BSP
    PerlinNoise
    pcg
    binary space partitioning
    정렬알고리즘
    커스텀 윈도우
    이진공간분할
    이진공간분할법
    절차적 던전 생성
    CustomWindow
    절차적던전생성
    CustomEditorWindow
    C#
    Custom Inspector
    unity
    최단경로찾기
  • 최근 댓글

  • 최근 글

  • 250x250
  • hELLO· Designed By정상우.v4.10.3
브라더스톤
[정렬 알고리즘, C#] 버블 정렬(Bubble Sort)
상단으로

티스토리툴바