반응형
1. 퀵 정렬 (quick sort) 이란?
- 기준점(pivot 이라고 부름) 정해
기준점보다 작은 데이터는 왼쪽(left)
큰 데이터는 오른쪽(right) 으로 모으는 함수 - 각 왼쪽(left), 오른쪽(right)은 재귀용법을 사용해서 다시 동일 함수를 호출하여 위 작업을 반복함
- 함수는 왼쪽(left) + 기준점(pivot) + 오른쪽(right) 리턴
2. 구현
- quicksort 함수 만들기
- 만약 리스트 갯수가 한개이면 해당 리스트 리턴
- 그렇지 않으면, 리스트 맨 앞의 데이터를 기준점(pivot)으로 놓기
- left, right 리스트 변수를 만들고,
- 맨 앞의 데이터를 뺀 나머지 데이터를 기준점과 비교(pivot)
- 기준점보다 작으면 left.append(해당 데이터)
- 기준점보다 크면 right.append(해당 데이터)
- return quicksort(left) + pivot + quicksort(right) 로 재귀 호출
def qsort(data):
if len(data) <= 1:
return data
left, right = list(), list()
pivot = data[0]
for index in range(1, len(data)):
if pivot > data[index]:
left.append(data[index])
else:
right.append(data[index])
return qsort(left) + [pivot] + qsort(right)
#list comprehension 사용해서 깔끔하게
def qsort(data):
if len(data) <= 1:
return data
pivot = data[0]
left = [ item for item in data[1:] if pivot > item ]
right = [ item for item in data[1:] if pivot <= item ]
return qsort(left) + [pivot] + qsort(right)
import random
data_list = random.sample(range(100), 10)
qsort(data_list)
>>>[7, 17, 19, 24, 34, 55, 60, 85, 86, 88]
3. 분석
시간복잡도는 O(n log n)
- 단, 최악의 경우
- 맨 처음 pivot이 가장 크거나, 가장 작으면
- 모든 데이터를 비교하는 상황이 나옴
- O(𝑛2n2)
반응형
'Algorithm Study > Algorithm' 카테고리의 다른 글
이진 탐색 (Binary Search) (0) | 2020.02.04 |
---|---|
순차 탐색 (Sequential Search) (0) | 2020.02.04 |
병합 정렬(merge sort) 알고리즘 (0) | 2020.01.20 |
동적 계획법 (Dynamic Programming)과 분할 정복 (Divide and Conquer) 알고리즘 (0) | 2020.01.13 |
재귀 용법(recursive call, 재귀 호출) (0) | 2020.01.09 |