버블 정렬(Bubble Sort)은 서로 인접한 두 원소를 검사하여 정렬하는 알고리즘입니다. 큰 값이 마치 물속의 거품(Bubble)처럼 수면(배열의 맨 끝) 위로 하나씩 밀려 올라가는 모습과 닮았다고 해서 붙여진 이름입니다.
버블 정렬은 정렬 알고리즘 중에서 구현이 가장 쉽지만, 실무 성능은 가장 처참한 알고리즘입니다.
● 인접 비교 : 첫 번째와 두 번째, 두 번째와 세 번째 등 바로 옆에 있는 데이터끼리만 계속 비교합니다.
● 교환(Swap) : 앞의 값이 뒤의 값보다 크면 자리를 바꿉니다(오름차순 기준).
● 확정 : 이렇게 배열을 한 바퀴(1 Pass) 다 돌고 나면, 현재 배열에서 가장 큰 값이 맨 마지막 자리로 이동하여 확정됩니다.
| 평가 기준 | 복잡도 | 심층 설명 |
|---|---|---|
| 최선 시간 복잡도 (Best) | O(N) | 배열이 이미 정렬되어 있는 경우입니다. swapped 플래그 최적화를 적용하면 첫 번째 바퀴(Pass)를 돌 때 단 한 번도 Swap이 일어나지 않으므로 즉시 O(N)으로 종료할 수 있습니다. |
| 평균/최악 시간 복잡도 | O(N²) | 배열이 역순인 최악의 경우, 이중 for문 안에서 매번 비교와 자리 교환(Swap) 연산이 발생합니다. 메모리 읽기/쓰기가 폭발적으로 일어나므로 N² 중에서도 가장 느립니다. |
| 공간 복잡도 | O(1) | 주어진 배열 내부에서 원소들의 자리만 바꾸는 제자리 정렬(In-place Sort)이므로 추가 메모리가 필요 없습니다. |
기본적인 버블 정렬은 배열이 이미 100% 정렬되어 있더라도 무식하게 끝까지 이중 for문을 돌며 O(N²)을 소모합니다. 이를 방지하기 위해 안쪽 루프를 도는 동안 한 번이라도 Swap이 발생했는지를 기록하는 boolean swapped 변수를 사용합니다. 한 바퀴를 돌았는데 Swap이 한 번도 안 일어났다면 이미 정렬이 끝났다는 뜻이므로 바깥쪽 루프를 과감하게 break 해버리는 것이 실무형 버블 정렬의 기본입니다.