728x90
반응형
728x90
버블 정렬(Bubble Sort)
버블 정렬(Bubble Sort)은 정렬 알고리즘 중 가장 단순한 방식으로, 인접한 두 값을 반복적으로 비교하고 필요에 따라 교환하여 정렬을 완성합니다. 이름처럼 큰 값이 점차 리스트 끝으로 ‘버블’처럼 떠오르는 모습에서 유래했습니다. 이 알고리즘은 이해와 구현이 매우 쉬워 알고리즘 학습의 입문 단계에서 자주 사용됩니다. 하지만 효율성 측면에서는 매우 낮기 때문에, 실무에서 사용되는 일은 거의 없습니다.
1. 버블 정렬이란?

버블 정렬은 인접한 두 요소를 비교하여 정렬 기준에 맞지 않으면 서로 교환하는 방식을 여러 번 반복하는 정렬 알고리즘입니다. 가장 큰 값이 반복문 한 번마다 맨 뒤로 이동하므로, 전체가 정렬될 때까지 과정을 반복합니다.
작동 방식 (오름차순 기준)
- 리스트의 첫 번째 요소부터 시작
- 인접한 두 값을 비교 → 큰 값을 오른쪽으로 이동
- 한 바퀴 돌면 가장 큰 값이 맨 끝으로 이동
- 남은 리스트에 대해 반복
장점
- 구현이 매우 간단함
- 개념이 직관적이라 학습용으로 적합
- 제자리(in-place) 알고리즘
단점
- 시간 복잡도가 매우 비효율적 (O(n²))
- 대규모 데이터에는 절대 부적합
- 이미 정렬된 경우를 제외하면 성능 저하 심각
2. 예시
초기 리스트 :
[5, 3, 8, 4, 2]
첫 번째 :
- 5 > 3 → 교환 → [3, 5, 8, 4, 2]
- 5 < 8 → 그대로
- 8 > 4 → 교환 → [3, 5, 4, 8, 2]
- 8 > 2 → 교환 → [3, 5, 4, 2, 8]
가장 큰 수 8이 맨 뒤로 이동
2회전 :
- 3 < 5 → 그대로
- 5 > 4 → 교환 → [3, 4, 5, 2, 8]
- 5 > 2 → 교환 → [3, 4, 2, 5, 8]
. . .
최종 결과 :
[2, 3, 4, 5, 8]
3. 언어별 구현 예시
a. Python
def bubble_sort(arr):
n = len(arr)
for i in range(n):
for j in range(0, n-i-1): # 점점 비교 범위 줄어듦
if arr[j] > arr[j+1]:
arr[j], arr[j+1] = arr[j+1], arr[j]
b. C++
void bubbleSort(std::vector<int>& arr) {
int n = arr.size();
for (int i = 0; i < n-1; ++i)
for (int j = 0; j < n-i-1; ++j)
if (arr[j] > arr[j+1])
std::swap(arr[j], arr[j+1]);
}
c. Java
void bubbleSort(int[] arr) {
int n = arr.length;
for (int i = 0; i < n-1; i++)
for (int j = 0; j < n-i-1; j++)
if (arr[j] > arr[j+1]) {
int tmp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = tmp;
}
}
d. JavaScript
function bubbleSort(arr) {
const n = arr.length;
for (let i = 0; i < n; i++)
for (let j = 0; j < n - i - 1; j++)
if (arr[j] > arr[j + 1]) {
[arr[j], arr[j + 1]] = [arr[j + 1], arr[j]];
}
}
4. 시간 복잡도 분석
케이스 | 시간 복잡도 |
최악의 경우 | O(n²) |
평균 | O(n²) |
최선 (정렬된 상태) | O(n) → 개선 버전에서 가능 |
공간 복잡도 | O(1) |
정렬 안정성 | 안정 정렬 |
5. 개선된 버블 정렬
정렬이 더 이상 필요하지 않음을 감지하면, 반복을 중단할 수 있습니다.
def improved_bubble_sort(arr):
n = len(arr)
for i in range(n):
swapped = False
for j in range(0, n-i-1):
if arr[j] > arr[j+1]:
arr[j], arr[j+1] = arr[j+1], arr[j]
swapped = True
if not swapped:
break
6. 마무리
- 버블 정렬은 가장 단순한 비교 기반 정렬로, 두 요소를 비교 후 필요 시 교환하는 방식입니다.
- 구현이 쉬운 대신 성능은 매우 낮아 학습용 외에는 잘 사용되지 않습니다.
- 개선형 버블 정렬을 통해 약간의 최적화를 할 수 있지만, 여전히 실무에서는 효율적인 알고리즘(퀵, 병합 등)이 선호됩니다.
함께 보면 좋은 자료
외부 사이트 :
블로그 글 :
[정렬] 꼭 알아야 할 7가지 정렬 알고리즘 비교 정리
정렬(Sorting) 정렬(Sorting)은 데이터를 일정한 순서(오름차순, 내림차순 등)로 재배치하는 알고리즘입니다. 정렬은 탐색, 최적화, 통계 처리 등 거의 모든 컴퓨터 과학 문제의 전처리 단계로 중요하
dachaes-devlogs.tistory.com
반응형
728x90
반응형
'코딩테스트 > 알고리즘' 카테고리의 다른 글
[삽입 정렬] 카드를 정렬하듯, 데이터를 끼워 넣는 알고리즘 (0) | 2025.05.02 |
---|---|
[선택 정렬] 가장 작은 값을 골라 정렬하는 알고리즘 (0) | 2025.05.02 |
[정렬] 꼭 알아야 할 8가지 정렬 알고리즘 비교 정리 (0) | 2025.05.02 |
[Queue] 줄 서서 처리하는 선입선출(FIFO) 자료구조 (0) | 2025.04.29 |
[Stack] 쌓고 꺼내는 후입선출(LIFO) 자료구조 (0) | 2025.04.29 |