데이터를 특정한 기준에 정렬하기 위해 사용하는 알고리즘입니다.
대표적인 정렬 라이브러리를 성능에 따라서 비교하면 다음과 같습니다.
병합 정렬(Merge Sort) ⭐️
퀵 정렬(Quick Sort) ⭐️
힙 정렬 ⭐️⭐️
1 ---> root (최솟값)
/ \\
3 5
/ \\ /
4 8 7
힙이란? (최소 힙 기준)
힙 정렬이란 최대 힙 트리나 최소 힙 트리를 구성해 정렬을 하는 방법으로서, 내림차순 정렬을 위해서는 최소 힙을 구성하고 오름차순 정렬을 위해서는 최대 힙을 구성하면 됩니다.
힙 정렬 시간 복잡도 : O(n log n)
파이썬의 heapq 모듈을 통해 사용 가능
heapq 모듈은 이진 트리(binary tree) 기반의 최소 힙(min heap) 자료구조를 제공
heapq.heapify()
heapify(heap)
O(n)
의 시간 복잡도를 가집니다.heapq.heappop()
heappop(heap)
heappop()
함수도 역시 O(log(n))
의 시간 복잡도를 가집니다.heapq.heappush
heappush(heap, 4)
heappush()
함수는 O(log(n))
의 시간 복잡도를 가집니다.최대 힙
힙에 튜플(tuple)를 원소로 추가하거나 삭제하면, 튜플 내에서 맨 앞에 있는 값을 기준으로 최소 힙이 구성되는 원리를 이용
from heapq import heappush, heappop
nums = [4, 1, 7, 3, 8, 5]
heap = []
for num in nums:
heappush(heap, (-num, num)) # (우선 순위, 값)
while heap:
print(heappop(heap)[1]) # index 1
그래서 힙 정렬은 어떻게?
from heapq import heappush, heappop
def heap_sort(nums):
heap = []
for num in nums:
heappush(heap, num)
# 위 과정을 heapify로 단순화시킬 수 있다.
# 최소값을 하나씩 반환 -> 이 과정에서 n * log(n)이 걸린다
sorted_nums = []
while heap:
sorted_nums.append(heappop(heap))
return sorted_nums
print(heap_sort([4, 1, 7, 3, 8, 5]))
정렬 알고리즘 | 평균 시간 복잡도 | 공간 복잡도 | 특징 |
---|---|---|---|
선택 정렬 | O(n²) | O(n) | 아이디어가 간단하나, 효율은 낮다. |
삽입 정렬 | O(n²) | O(n) | 데이터가 거의 정렬되어 있을 때는 가장 빠름 |
퀵 정렬 | O(n log n) | O(n) | 대부분의 경우 가장 적합 |
충분히 빠르다 | |||
계수 정렬 | O(n + k) | O(n + k) | 특정한 값을 가지는 데이터의 개수를 카운트하는 방법 |
데이터의 크기가 한정되어 있는 경우에만 사용이 가능, 매우 빠르게 동작 |