2025. 8. 29. 17:10ㆍDeveloper Roadmap/Data Structures & Algorithms

정렬 알고리즘 종류와 파이썬 코드 예제 정리
프로그래밍에서 가장 기본적이면서도 중요한 개념 중 하나가 바로 **정렬 알고리즘(Sorting Algorithms)**이다.
정렬은 데이터를 오름차순이나 내림차순으로 나열하여 검색, 탐색, 분석 등을 더 빠르게 수행할 수 있도록 한다.
이번 글에서는 대표적인 정렬 알고리즘 종류와 함께 파이썬 코드 예제를 정리해본다.
정렬 알고리즘이란?
정렬 알고리즘은 배열이나 리스트의 원소들을 비교하여 특정 기준(숫자 크기, 사전식 순서 등)에 따라 재배열하는 알고리즘이다.
대표적인 정렬 알고리즘으로는 다음과 같은 것들이 있다.
- 버블 정렬 (Bubble Sort)
- 삽입 정렬 (Insertion Sort)
- 선택 정렬 (Selection Sort)
- 병합 정렬 (Merge Sort)
- 퀵 정렬 (Quick Sort)
- 힙 정렬 (Heap Sort)
각 알고리즘은 상황에 따라 장단점이 다르며, 데이터의 크기나 정렬 상태에 따라 성능 차이가 크다.
버블 정렬 (Bubble Sort)
버블 정렬은 인접한 원소들을 비교해 잘못된 순서일 경우 교환한다. 가장 큰 값이 뒤로 밀려나며 정렬된다.
시간 복잡도는 최악의 경우 O(n²)이다.
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]
return arr
print(bubble_sort([64, 25, 12, 22, 11]))
삽입 정렬 (Insertion Sort)
삽입 정렬은 왼쪽에서부터 하나씩 원소를 꺼내 이미 정렬된 부분에 삽입하는 방식이다.
작은 데이터셋이나 부분적으로 정렬된 데이터에 효율적이며, 시간 복잡도는 O(n²)이다.
def insertion_sort(arr):
for i in range(1, len(arr)):
key = arr[i]
j = i - 1
while j >= 0 and key < arr[j]:
arr[j + 1] = arr[j]
j -= 1
arr[j + 1] = key
return arr
print(insertion_sort([64, 25, 12, 22, 11]))
선택 정렬 (Selection Sort)
선택 정렬은 전체 리스트에서 가장 작은 값을 선택해 맨 앞으로 옮기는 과정을 반복한다.
시간 복잡도는 항상 O(n²)이다.
def selection_sort(arr):
n = len(arr)
for i in range(n):
min_idx = i
for j in range(i + 1, n):
if arr[j] < arr[min_idx]:
min_idx = j
arr[i], arr[min_idx] = arr[min_idx], arr[i]
return arr
print(selection_sort([64, 25, 12, 22, 11]))
병합 정렬 (Merge Sort)
병합 정렬은 분할 정복(Divide and Conquer) 방식을 사용한다.
리스트를 둘로 나누고 각각을 정렬한 뒤, 병합하는 과정을 반복한다.
시간 복잡도는 항상 O(n log n)이다.
def merge_sort(arr):
if len(arr) <= 1:
return arr
mid = len(arr) // 2
left = merge_sort(arr[:mid])
right = merge_sort(arr[mid:])
return merge(left, right)
def merge(left, right):
result = []
i = j = 0
while i < len(left) and j < len(right):
if left[i] < right[j]:
result.append(left[i])
i += 1
else:
result.append(right[j])
j += 1
result.extend(left[i:])
result.extend(right[j:])
return result
print(merge_sort([64, 25, 12, 22, 11]))
퀵 정렬 (Quick Sort)
퀵 정렬은 피벗(Pivot)을 기준으로 작은 값과 큰 값을 나누고 재귀적으로 정렬한다.
평균 시간 복잡도는 O(n log n)이며, 최악의 경우 O(n²)이다.
def quick_sort(arr):
if len(arr) <= 1:
return arr
pivot = arr[len(arr) // 2]
left = [x for x in arr if x < pivot]
middle = [x for x in arr if x == pivot]
right = [x for x in arr if x > pivot]
return quick_sort(left) + middle + quick_sort(right)
print(quick_sort([64, 25, 12, 22, 11]))
힙 정렬 (Heap Sort)
힙 정렬은 이진 힙(binary heap)을 기반으로 정렬한다.
최대 힙(Max-Heap)을 구성하고, 루트(최대값)를 꺼내 배열 끝에 배치한 뒤 다시 힙을 구성한다.
시간 복잡도는 항상 O(n log n)이다.
def heapify(arr, n, i):
largest = i
l = 2 * i + 1
r = 2 * i + 2
if l < n and arr[l] > arr[largest]:
largest = l
if r < n and arr[r] > arr[largest]:
largest = r
if largest != i:
arr[i], arr[largest] = arr[largest], arr[i]
heapify(arr, n, largest)
def heap_sort(arr):
n = len(arr)
for i in range(n // 2 - 1, -1, -1):
heapify(arr, n, i)
for i in range(n - 1, 0, -1):
arr[i], arr[0] = arr[0], arr[i]
heapify(arr, i, 0)
return arr
print(heap_sort([64, 25, 12, 22, 11]))
정리
정렬 알고리즘은 데이터 구조와 알고리즘 학습에서 반드시 다뤄야 할 핵심 주제다.
- 버블, 삽입, 선택 정렬은 구현이 단순하지만 성능이 낮다.
- 병합, 퀵, 힙 정렬은 대규모 데이터에서 강력한 성능을 보인다.
코딩 테스트와 실무에서 자주 등장하는 만큼, 여러 정렬 알고리즘을 직접 구현해보고 차이를 이해하는 것이 중요하다.
'Developer Roadmap > Data Structures & Algorithms' 카테고리의 다른 글
| 트리 자료구조와 탐색 알고리즘 (Python 예제) (0) | 2025.09.14 |
|---|---|
| 검색 알고리즘 (Search Algorithms) — 선형 탐색과 이진 탐색 파이썬 구현 (0) | 2025.09.09 |
| 알고리즘 복잡도(Big O, Θ, Ω) 완벽 정리와 파이썬 예제 (2) | 2025.08.08 |
| 자료구조란? 프로그래머가 반드시 알아야 할 기초 개념 (4) | 2025.07.29 |
| 파이썬으로 배우는 Programming Fundamentals – 프로그래밍 기초 완전 정복 (0) | 2025.07.24 |