분할 정복 알고리즘의 대표적인 예
1. 보통 리스트의 첫 번째 원소를 기준점(pivot)으로 한다
2. pivot보다 작은 데이터는 left 리스트, 큰 데이터는 right 리스트에 더한다
3. left 리스트 + [pivot] + right 리스트를 리턴한다
3-1. left, right 리스트는 재귀용법을 사용해서 위 작업을 반복한다
4. 리스트의 길이가 1이면 해당 리스트를 반환한다
* 시간복잡도 O(n logn) / 최악의 경우 O(n^2)
import random
def quick_sort(data):
if len(data) <=1:
return data
left, right = list(), list()
pivot = data[0]
for x in range(1, len(data)):
if data[x] < pivot:
left.append(data[x])
else:
right.append(data[x])
return quick_sort(left) + [pivot] + quick_sort(right)
data = random.sample(range(10), 5)
print(data) # [2, 9, 5, 7, 4]
print(quick_sort(data)) # [2, 4, 5, 7, 9]
- 리스트 컴프리헨션을 사용했을 때 코드는 훨씬 간결해진다!
import random
def quick_sort(data):
if len(data) <=1:
return data
pivot = data[0]
left = [ n for n in data[1:] if n < pivot ]
right = [ n for n in data[1:] if n >= pivot ]
return quick_sort(left) + [pivot] + quick_sort(right)
data = random.sample(range(10), 5)
print(data) # [8, 4, 2, 0, 6]
print(quick_sort(data)) # [0, 2, 4, 6, 8]
- 출처 : fastcampus
'알고리즘 이론 > 정렬' 카테고리의 다른 글
합병/병합 정렬(merge sort) (0) | 2020.10.01 |
---|---|
삽입 정렬(insertion sort) (0) | 2020.09.28 |
선택 정렬(selection sort) (0) | 2020.09.28 |
버블 정렬(bubble sort) (0) | 2020.09.13 |
댓글