퀵 정렬
호어 분할 방식 기준 퀵 정렬 (위키 백과)
1. 리스트 가운데서 하나의 원소를 고른다. 이렇게 고른 원소를 피벗이라고 한다.
2. 피벗 앞에는 피벗보다 값이 작은 모든 원소들이 오고, 피벗 뒤에는 피벗보다 값이 큰 모든 원소들이 오도록 피벗을 기준으로 리스트를 둘로 나눈다. 이렇게 리스트를 둘로 나누는 것을 분할이라고 한다. 분할을 마친 뒤에 피벗은 더 이상 움직이지 않는다.
3. 분할된 두 개의 작은 리스트에 대해 재귀(Recursion)적으로 이 과정을 반복한다. 재귀는 리스트의 크기가 0이나 1이 될 때까지 반복된다.
2번 '분할을 마친 뒤에 피벗은 더 이상 움직이지 않는다.'를 보면 퀵 정렬은 매 단계에서 적어도 1개의 원소가 자기 자리를 찾게 됨을 알 수 있다.
<참고 코드>
이것이 취업을 위한 코딩 테스트다 with 파이썬 - 6.4py
https://github.com/ndb796/python-for-coding-test/blob/master/6/4.py
array = [5, 7, 9, 0, 3, 1, 6, 2, 4, 8]
def quick_sort(array, start, end):
if start >= end: # 원소가 1개인 경우 종료
return
pivot = start # 피벗은 첫 번째 원소
left = start + 1
right = end
while(left <= right):
# 피벗보다 큰 데이터를 찾을 때까지 반복
while(left <= end and array[left] <= array[pivot]):
left += 1
# 피벗보다 작은 데이터를 찾을 때까지 반복
while(right > start and array[right] >= array[pivot]):
right -= 1
if(left > right): # 엇갈렸다면 작은 데이터와 피벗을 교체
array[right], array[pivot] = array[pivot], array[right]
else: # 엇갈리지 않았다면 작은 데이터와 큰 데이터를 교체
array[left], array[right] = array[right], array[left]
# 분할 이후 왼쪽 부분과 오른쪽 부분에서 각각 정렬 수행
quick_sort(array, start, right - 1)
quick_sort(array, right + 1, end)
quick_sort(array, 0, len(array) - 1)
print(array)
(파이썬의 장점을 살린 퀵 정렬 소스코드)
이것이 취업을 위한 코딩 테스트다 with 파이썬 - 6.5py
https://github.com/ndb796/python-for-coding-test/blob/master/6/5.py
array = [5, 7, 9, 0, 3, 1, 6, 2, 4, 8]
def quick_sort(array):
# 리스트가 하나 이하의 원소만을 담고 있다면 종료
if len(array) <= 1:
return array
pivot = array[0] # 피벗은 첫 번째 원소
tail = array[1:] # 피벗을 제외한 리스트
left_side = [x for x in tail if x <= pivot] # 분할된 왼쪽 부분
right_side = [x for x in tail if x > pivot] # 분할된 오른쪽 부분
# 분할 이후 왼쪽 부분과 오른쪽 부분에서 각각 정렬을 수행하고, 전체 리스트를 반환
return quick_sort(left_side) + [pivot] + quick_sort(right_side)
print(quick_sort(array))
피벗과 데이터를 비교하는 비교 연산 횟수가 증가하므로 시간 면에서는 조금 비효율적임
'Problem Solving > 이론' 카테고리의 다른 글
Python :: 최단 경로 - A* 알고리즘 (0) | 2022.05.14 |
---|---|
Python:: 정렬 - 힙 정렬 (0) | 2022.03.15 |
Python:: 정렬 - 삽입 정렬 (0) | 2022.03.15 |
Python:: 정렬 - 선택 정렬 (1) | 2022.03.15 |
Python:: 탐색 알고리즘 DFS/BFS (0) | 2022.02.17 |