
버블 정렬 핸드북
1. 개요 및 목적
버블 정렬은 인접한 두 원소를 반복해서 비교·교환하며 정렬하는 가장 단순한 비교 기반 알고리즘이다.
- 목적: 원소가 거의 정렬된 상태이거나, 소규모 데이터셋을 간단히 정렬할 때 사용
- 교육적 활용: 컴퓨터 과학 입문자의 알고리즘 사고 교육용
2. 동작 구조
2.1 기본 아이디어
- 배열의 처음부터 인접 쌍을 비교
- 왼쪽이 더 크면 교환(swap)
- 끝까지 진행하면 가장 큰 값이 배열 끝으로 “버블업”
- 교환이 발생하지 않을 때까지 1–3을 반복
2.2 단계별 흐름
- 첫 번째 패스: 배열 전체를 한 번 순회. 최대값이 최종 위치로 이동
- 두 번째 패스: 마지막 원소 제외한 나머지 순회
- …
- 종료 조건: 한 패스에서도 교환이 없으면 완전 정렬로 판단하여 종료
2.3 의사 코드
procedure bubbleSort(A[0…n−1]):
n ← length(A)
repeat
swapped ← false
for i from 1 to n−1 do
if A[i−1] > A[i] then
swap(A[i−1], A[i])
swapped ← true
end if
end for
n ← n − 1
until not swapped
end procedure
3. 시간 및 공간 복잡도
구분 | 시간 복잡도 | 공간 복잡도 | 안정성 |
---|---|---|---|
최악 및 평균 | O(n²) | O(1) | 안정적 ✔ |
최선 | O(n) (이미 정렬된 경우) |
- Adaptive 특성: 거의 정렬된 배열에서 빠르게 수렴
- 비효율성: 대규모 데이터셋에는 비추천
4. 최적화 기법
- 패스 감소: 매 패스마다 비교 범위(
n
)를 하나씩 줄임 - 마지막 교환 위치 기록: 마지막으로 교환이 발생한 인덱스까지만 다음 패스 비교
- 양방향 순회(Cocktail Shaker Sort): 왼→오, 오→왼 번갈아가며 순회하며 ‘터틀’ 요소 이동 가속
5. 사용법 및 구현 예시
5.1 파이썬 코드
def bubble_sort(arr):
n = len(arr)
while True:
swapped = False
for i in range(1, n):
if arr[i-1] > arr[i]:
arr[i-1], arr[i] = arr[i], arr[i-1]
swapped = True
if not swapped:
break
n -= 1
return arr
5.2 자바스크립트 코드
function bubbleSort(arr) {
let n = arr.length;
let swapped;
do {
swapped = false;
for (let i = 1; i < n; i++) {
if (arr[i-1] > arr[i]) {
[arr[i-1], arr[i]] = [arr[i], arr[i-1]];
swapped = true;
}
}
n--;
} while (swapped);
return arr;
}
6. 실제 활용 사례
- 교육용 시각화: 알고리즘 학습 시 교환 과정을 애니메이션으로 보여주기
- 소규모 데이터 정렬: 수십 개 이하의 요소 정렬
- 거의 정렬된 데이터 점검: 사소한 오류(인접 두 원소 교환) 수정 시 빠른 처리
7. 버블 정렬의 한계 및 대안
- 한계: O(n²) 성능, 메모리 캐시·분기 예측 비효율
- 대안 알고리즘:
- 삽입 정렬(Insertion Sort): 평균적으로 더 빠름
- 퀵 정렬(Quicksort), 병합 정렬(Mergesort): 대규모 데이터에 적합
핵심 요약: 버블 정렬은 단순 구현과 가독성, 안정성을 제공하지만, 시간 복잡도 O(n²)로 인해 실무에서는 삽입 정렬, 퀵 정렬 등 더 효율적 알고리즘을 주로 사용한다. Small-scale or nearly sorted data에 한해 교육·프로토타입 용도로 활용하면 적합하다.
⁂