평균적으로 매우 빠른 실행 시간을 가지는 비교 기반 정렬 알고리즘이다. 분할 정복(divide and conquer) 방식을 통해 큰 문제를 작은 문제로 나누어 해결한다. '피벗(pivot)'을 사용하여 배열을 분할하는 것이 핵심이며, 피벗을 기준으로 피벗보다 작은 모든 요소는 피벗의 왼쪽에, 큰 모든 요소는 피벗의 오른쪽에 위치하도록 배열을 재배치한다.
💡 특징
def quickSort(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 quickSort(left) + middle + quickSort(right)
# 예시 배열
arr = [3, 6, 8, 10, 1, 2, 1]
sorted_arr = quickSort(arr)
print("정렬된 배열:", sorted_arr)
분할 정복(Divide and Conquer) 알고리즘으로, 큰 문제를 작은 문제로 나눈 뒤 각각 해결한 다음 결과를 합쳐 전체 문제의 답을 얻는 방법이다. 평균적으로 O(n log n)의 시간 복잡도를 가지며, 안정적인 정렬 방법으로 동일한 값을 가진 원소의 상대적인 순서가 변경되지 않는다.
💡 특징
def merge_sort(arr):
if len(arr) > 1:
mid = len(arr)//2
L = arr[:mid]
R = arr[mid:]
merge_sort(L)
merge_sort(R)
i = j = k = 0
while i < len(L) and j < len(R):
if L[i] < R[j]:
arr[k] = L[i]
i += 1
else:
arr[k] = R[j]
j += 1
k += 1
while i < len(L):
arr[k] = L[i]
i += 1
k += 1
while j < len(R):
arr[k] = R[j]
j += 1
k += 1
return arr
# 예시 데이터를 사용한 정렬
arr = [38, 27, 43, 3, 9, 82, 10]
sorted_arr = merge_sort(arr)
print(sorted_arr)
데이터의 자릿수나 문자의 위치를 기준으로 그룹을 나누어 정렬한다. 특히 정수를 정렬할 때 효율적이며, 내부적으로 안정적인 카운팅 정렬(Counting Sort)이나 버킷 정렬(Bucket Sort)을 사용하여 각 자릿수별로 정렬을 수행한다. 기수 정렬의 시간 복잡도는 O(nk)로, n은 정렬할 원소의 수, k는 원소의 최대 자릿수를 의미한다.
💡 특징
def counting_sort(arr, exp1):
n = len(arr)
output = [0] * n
count = [0] * (10)
for i in range(0, n):
index = arr[i] // exp1
count[index % 10] += 1
for i in range(1, 10):
count[i] += count[i - 1]
i = n - 1
while i >= 0:
index = arr[i] // exp1
output[count[index % 10] - 1] = arr[i]
count[index % 10] -= 1
i -= 1
for i in range(0, len(arr)):
arr[i] = output[i]
def radix_sort(arr):
max1 = max(arr)
exp = 1
while max1 // exp > 0:
counting_sort(arr, exp)
exp *= 10
arr = [170, 45, 75, 90, 802, 24, 2, 66]
radix_sort(arr)
print(arr)