버블 정렬
버블 정렬 알고리즘의 개요, 특징, 동작 원리 및 파이썬 구현 예제
버블 정렬
Bubble Sort
버블 정렬(Bubble Sort)은 정렬 알고리즘 중 하나로, 배열을 정렬할 때 인접한 두 요소를 비교하여 교환하는 방식으로 동작한다. 가장 큰 값이 반복적으로 배열의 끝으로 이동하는 모습이 마치 물속에서 거품이 위로 올라가는 것과 비슷하다고 하여 버블 정렬이라는 이름이 붙었다.
특징
- 시간 복잡도:
- 평균: (O(n^2))
- 최악: (O(n^2))
- 최선(이미 정렬된 경우): (O(n))
- 공간 복잡도: (O(1)) (제자리 정렬, 추가 메모리 필요 없음)
- 정렬 방식: 안정 정렬 (동일한 값의 순서가 유지됨)
- 구현의 단순성: 이해와 구현이 매우 쉬운 정렬 알고리즘.
동작 원리
- 배열의 첫 번째 요소부터 시작하여 인접한 두 요소를 비교한다.
- 두 요소의 순서가 잘못되었다면(오름차순 기준: 앞의 값 > 뒤의 값), 위치를 교환한다.
- 이 과정을 배열의 끝까지 반복한다. 이를 1회전이라고 한다.
- 각 회전이 끝날 때 가장 큰 값이 배열의 끝에 위치하게 된다.
- 배열이 완전히 정렬될 때까지 위 과정을 반복한다.
파이썬 코드 구현 예제
다음은 버블 정렬 알고리즘을 구현한 예제이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
def bubble_sort(arr):
"""
버블 정렬 알고리즘을 구현한 함수.
입력: 정렬되지 않은 배열 arr
출력: 오름차순으로 정렬된 배열
"""
n = len(arr) # 배열의 길이를 저장
for i in range(n - 1): # 정렬 회전 횟수
swapped = False # 이번 회전에서 교환이 발생했는지 체크
for j in range(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
return arr
# 테스트
data = [64, 34, 25, 12, 22, 11, 90]
sorted_data = bubble_sort(data)
print("정렬된 배열:", sorted_data)
코드 설명
- 외부 반복문:
for i in range(n - 1)
은 배열의 크기에서 1을 뺀 만큼 반복한다. 각 회전마다 가장 큰 값이 배열의 끝으로 이동한다. - 내부 반복문:
for j in range(n - i - 1)
은 각 회전에서 아직 정렬되지 않은 구간만큼 비교를 진행한다. - 교환 조건:
if arr[j] > arr[j + 1]
은 현재 요소가 다음 요소보다 클 경우 교환하도록 한다. - 최적화:
swapped
변수를 통해 교환이 없을 경우 반복을 조기에 종료한다.
장단점
장점
- 구현이 매우 간단하다.
- 코드의 직관성이 높아 학습 목적으로 적합하다.
단점
- 비효율적이며, 대규모 데이터에는 적합하지 않다.
- (O(n^2))의 시간 복잡도로 인해 정렬 속도가 느리다.
추가 개념
버블 정렬은 단순하면서도 효율적인 최적화를 도입할 수 있다. 예를 들어, 교환이 없으면 반복을 중단하거나, 정렬된 범위를 줄이는 등의 방법이 있다. 이러한 특징 덕분에 알고리즘의 기본 원리를 이해하는 데 유용하다.
Reference 책 - Do it! 알고리즘 코딩테스트 with Python
This post is licensed under CC BY 4.0 by the author.