티스토리 뷰
반응형
퀵 정렬(Quick Sort)란, 피벗(pivot, 기준값)을 기준으로 큰 데이터와 작은 데이터를 찾아서 위치를 변경하는 정렬 방식이다.
퀵 정렬(Quick sort) 동작 순서
오름차순으로 정렬하는 방법에 대해 알아보자.
- 기준점이 될 index를 pivot으로 설정한다.(random value)
- 새로운 리스트 2개를 만들고, pivot 값보다 작은 값들과 큰 값들을 모아서 각각 리스트에 담는다.
- pivot값을 기준으로 작은 값이 모든 리스트는 왼쪽, 큰 값들의 리스트는 오른쪽으로 붙인다.
- 1-3을 재귀로 반복한다.
퀵 정렬(Quick sort) 구현
퀵 정렬의 구현 방법은 아래와 같다.
def quick_sort(collection):
"""
Examples:
>>> quick_sort([0, 5, 3, 2, 2])
[0, 2, 2, 3, 5]
>>> quick_sort([])
[]
>>> quick_sort([-2, 5, 0, -45])
[-45, -2, 0, 5]
"""
if len(collection) < 2:
return collection
pivot_index = 0 # Use random element as pivot
pivot = collection[pivot_index]
greater = [] # All elements greater than pivot
lesser = [] # All elements less than or equal to pivot
for element in collection[:pivot_index]:
(greater if element > pivot else lesser).append(element)
for element in collection[pivot_index + 1:]:
(greater if element > pivot else lesser).append(element)
return [*quick_sort(lesser), pivot, *quick_sort(greater)]
alist = [54, 26, 93, 17, 77, 31, 44, 55, 20]
print(quick_sort(alist))
퀵 정렬(Quick sort)의 시간 복잡도(Time Complexity)
우리가 알아보았던 선택정렬과 삽입정렬의 시간 복잡도는 O(N^2)로 느리다. 퀵 정렬의 시간 복잡도는 O(N log N)으로 정렬속도가 빠르다. 하지만, 모든 정렬 알고리즘이 장점만 있는 것은 아니다. 퀵 정렬의 단점은 리스트가 어느 정도 정렬 되어 상태라면 삽입 정렬이 더 빠르다. 정렬 정도에 따른 적절한 정렬 알고리즘을 고르자.
퀵 정렬과 병합 정렬
추가로 퀵 정렬과 병합 정렬의 차이에 대해 알아보자. 위의 코드를 확인해 보면, 퀵 정렬이 주어진 리스트를 분할하고 병합하는 것이 병합정렬과 비슷해 보인다. 그렇다면 차이점은 무엇일까? 병합정렬은 두 부분으로 나눈 후에 각 정렬이 끝난 후 병합하는 후처리 작업이 추가로 필요하다. 하지만 퀵 정렬은 기준값(pivot item)을 중심으로 작은 값은 왼쪽, 큰 값은 오른쪽으로 위치시킨다. 따라서 분할하는 과정에서 pivot들이 자기 자리를 찾아가기 때문에, 분할 이후에 병합하는 과정에서 후처리 작업이 불필요하다.
반응형
'알고리즘 > 알고리즘 종류' 카테고리의 다른 글
선형탐색알고리즘(linear search algorithm) 과 이진탐색알고리즘(binary search algorithm) (0) | 2023.08.17 |
---|---|
[선형 자료구조 - Python] 연결 리스트(Linked List) (0) | 2023.07.31 |
[자료구조 - Python] 큐(Queue) 기초부터 심화까지 (1) | 2023.06.29 |
알고리즘(Algorithm) 기초 정리 - python (159) | 2023.06.06 |
[코딩테스트] 문자열 유형 완벽 정리_2 (0) | 2021.02.16 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- react autoFocus
- BFS
- vuejs
- django
- TensorFlow
- useHistory 안됨
- 클라우데라
- Vue
- logout
- read_csv
- next.config.js
- Queue
- error:0308010C:digital envelope routines::unsupported
- pandas
- Deque
- JavaScript
- login
- nextjs autoFocus
- typescript
- Python
- react
- 자연어처리
- NextJS
- mongoDB
- useState
- Express
- UserCreationForm
- 자료구조
- nodejs
- DFS
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
글 보관함