정렬(Sorting)이란 데이터를 오름차순(작은 → 큰) 또는 내림차순(큰 → 작은)으로 정리하는 과정이다.
이제 정렬의 종류에 대해 알아보자
.
.
.
💡 가장 느린 정렬 방법!
def bubble_sort(arr): n = len(arr) for i in range(n): for j in range(n - i - 1): if arr[j] > arr[j + 1]: # 인접 요소 비교 후 교환 arr[j], arr[j + 1] = arr[j + 1], arr[j]
💡 가장 작은/큰 값을 선택해 제자리에 놓는 방식
def selection_sort(arr): n = len(arr) for i in range(n): min_index = i for j in range(i + 1, n): if arr[j] < arr[min_index]: # 최소값 찾기 min_index = j arr[i], arr[min_index] = arr[min_index], arr[i] # 교환
💡 손으로 카드 정렬하는 방식
def insertion_sort(arr): n = len(arr) for i in range(1, n): key = arr[i] j = i - 1 while j >= 0 and arr[j] > key: # 왼쪽 값과 비교하여 삽입 위치 찾기 arr[j + 1] = arr[j] j -= 1 arr[j + 1] = key
💡 가장 많이 쓰이는 정렬!
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) # 재귀적으로 정렬
💡 데이터가 랜덤하게 섞인 경우 퀵 정렬보다 안정적인 정렬
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 += left[i:] + right[j:] return result
✔ Python의 sort()는 퀵 정렬과 병합 정렬을 혼합한 Timsort(O(N log N)) 사용
arr = [5, 3, 8, 1, 2] arr.sort() # 정렬된 리스트 반환 print(arr) # [1, 2, 3, 5, 8]
✔ 리스트 복사 없이 정렬하려면 sorted() 사용
arr = [5, 3, 8, 1, 2] sorted_arr = sorted(arr)