퀵 셀렉션은 리스트를 정렬하지 않고 K번째로 큰 수를 알고 싶을 때 쓰는 방법이다.
전체적인 솔루션은 퀵 정렬과 매우 유사하다, 피벗을 하나 골라서 값을 비교하면서, 피벗보다 작은 리스트, 피벗 보다 큰 리스트로 나눈다.
k번째 숫자가 속해있는 리스트만 가지고 다시 재귀적으로 반복한다.
median 값을 찾을 때도 활용 가능.
평균 시간복잡도는 O(n)
def quick_selection(arr, kth):
pivot = arr[(len(arr)+1)//2 - 1]
left, mid, right = [], [], []
for i in range(len(arr)):
if arr[i] < pivot:
left.append(arr[i])
elif arr[i] > pivot:
right.append(arr[i])
else:
mid.append(arr[i])
if kth < len(left):
return quick_selection(left, kth)
elif kth < len(left) + len(mid):
return mid[0]
else:
return quick_selection(right, kth - len(left) - len(mid))
arr = [3, 5, 1, 2, 9, 6, 4, 7, 5]
print(quick_selection(arr, 4))
'아카이빙' 카테고리의 다른 글
Python으로 알고리즘 공부 07. 중위표기법(Infix)를 후위표기법(Postfix)로 변환 (2) | 2017.07.07 |
---|---|
Python으로 알고리즘 공부 06. 소수 (Prime number) (0) | 2017.07.05 |
Python으로 알고리즘 공부 04. 이진 검색 (Binary Search) (0) | 2017.07.05 |
Python으로 알고리즘 공부 03. 계수 정렬 (Counting Sort) (0) | 2017.07.03 |
Python으로 알고리즘 공부 02. 퀵 정렬 (Quick Sort) (0) | 2017.07.03 |