반응형
Concept
병합 정렬(Merge Sort)과 마찬가지로, 퀵 정렬은 분할 정복(Divide and Conquer) 기법과 재귀 알고리즘을 이용한 정렬 알고리즘으로, 시간복잡도는 $O(nlogn)$이다
하나의 리스트에서 피봇(pivot)이라고 불리는 임의의 기준값을 사용하여 pivot 값을 기준으로 pivot 보다 작은 값의 그룹과 큰값의 그룹으로 나눈다. 이 때 두 그룹의 각 요소들은 정렬된 상태는 아니지만, pivot은 정렬된 위치로 들어가게되며 이를 재귀호출을 통해 정렬하게 된다. 전체적인 동작 과정은 다음과 같다
구현 코드
(아래 코드는 pivot을 arr의 첫번째 요소로 잡은 코드입니다; pivot = arr[0])
1) 정렬되지 않은 데이터 -> 리스트로 입력 받기
>>>3 2 4 6 9 1 8 7 5
arr = [int(x) for x in input().split()]
2) quick sort
partition 함수는 pivot의 전체 리스트에서 정렬된 위치를 반환한다
def quick_sort(arr, i, j):
if i < j:
pivot = partition(arr, i, j) # pivot의 정렬된 위치를 반환받음
quick_sort(arr, i, pivot-1) # pivot을 기준으로 작은 그룹
quick_sort(arr, pivot+1, j) # pivot을 기준으로 큰 그룹
3) partition
pivot을 전체 리스트에서 정렬된 위치로 이동시켜주며, pivot을 기준으로 왼쪽은 작은 값을, 오른쪽은 큰 값을 두게 된다
def partition(arr, s, e):
# pivot을 arr의 첫번째 원소값으로 초기화
pivot_idx = s
pivot = arr[pivot_idx]
while s < e:
# arr[s]가 pivot보다 크면 스탑
while s < len(arr) and arr[s] <= pivot:
s += 1
# arr[e]가 pivot보다 작으면 스탑
while arr[e] > pivot:
e -= 1
# s,e위치가 스왑되지 않았다면 arr[s],arr[e]를 스왑
if s < e:
arr[s], arr[e] = arr[e], arr[s]
# s > e 상태로 현재 e의 위치는 pivot의 정렬된 위치임
# 따라서 arr[e], arr[pivot_idx]를 스왑
arr[e], arr[pivot_idx] = arr[pivot_idx], arr[e]
# pivot의 정렬된 위치 반환
return e
3) 정렬결과 확인
quick_sort(arr, 0, len(arr)-1)
print(arr)
>>>1 2 3 4 5 6 7 8 9
반응형
'Algorithm > 자료구조' 카테고리의 다른 글
파이썬으로 구현하는 병합정렬(Merge Sort) (4) | 2022.03.13 |
---|---|
파이썬으로 구현하는 덱(Deque) (2) | 2021.12.26 |
파이썬으로 구현하는 원형 큐(Circular Queue) (2) | 2021.12.26 |
[이론] 우선순위 큐 (Priority Queue) (0) | 2021.07.15 |
[이론] 힙(Heap) (0) | 2021.07.15 |