퀵 소트(Quick Sort)는 분할 정복(divide and conquer) 알고리즘을 기반으로 하는 정렬 알고리즘 중 하나입니다. 평균적으로 매우 빠른 수행 시간을 가지고 있어서 실제로도 많이 사용되고 있습니다.
퀵 소트 알고리즘은 다음과 같은 단계로 구성됩니다.
1. 배열 내에서 특정한 기준값(pivot)을 선택합니다. 대개는 배열의 중간값을 선택하거나, 랜덤하게 선택합니다.
2. 배열을 pivot을 기준으로, 작은 값들은 pivot의 왼쪽에 위치시키고, 큰 값들은 pivot의 오른쪽에 위치시킵니다. 이 과정을 partitioning이라고 부릅니다.
3. pivot을 제외한 왼쪽과 오른쪽 부분 배열에 대해서도 같은 방식으로 partitioning을 수행합니다.
4. 2, 3 과정을 반복적으로 수행하며, 부분 배열의 크기가 1이 될 때까지 진행합니다.
퀵 소트 알고리즘은 재귀 함수를 사용하여 구현할 수 있습니다. 다음은 파이썬으로 구현된 퀵 소트 알고리즘 예제입니다.
def quick_sort(arr):
if len(arr) <= 1:
return arr
pivot = arr[len(arr) // 2]
left = [x for x in arr if x < pivot]
equal = [x for x in arr if x == pivot]
right = [x for x in arr if x > pivot]
return quick_sort(left) + equal + quick_sort(right)
이 코드에서는 배열의 중간값을 pivot으로 선택하고, pivot을 기준으로 왼쪽, 오른쪽, 같은 값들을 각각의 리스트에 저장합니다. 이후 재귀 함수를 사용하여 왼쪽과 오른쪽 부분 배열에 대해서도 같은 방식으로 퀵 소트 알고리즘을 수행하고, 마지막에 리스트들을 합쳐서 반환합니다.
퀵 소트 알고리즘은 평균적으로 O(nlogn)의 시간 복잡도를 가지지만, 최악의 경우 O(n^2)의 시간 복잡도를 가질 수도 있습니다. 이는 pivot값이 최소값이나 최대값인 경우에 발생합니다. 이러한 경우를 방지하기 위해서는 pivot 값을 랜덤하게 선택하거나, 세 값 중 중간값을 선택하는 방법 등을 사용할 수 있습니다.
'CS > 알고리즘' 카테고리의 다른 글
합병 정렬(Merge Sort) 알고리즘 파이썬 예제와 설명 (0) | 2023.05.10 |
---|---|
버블 정렬(Bubble Sort) 알고리즘 예제와 설명 (0) | 2023.05.10 |
알고리즘 이진 탐색(Binary Search) 파이썬 예제 (0) | 2023.05.06 |
알고리즘 선택 정렬(Selection Sort) 예제 (0) | 2023.05.06 |