분할 : 배열을 다음과 같은 조건이 만족되도록 두 부분으로 나눈다.
elements in lower parts <= elements in upper parts
정복 : 각 부분을 순환적으로 정렬한다.
합병 : x
마지막 값을 pivot으로 선택하려고 한다.
피봇을 기준으로 작은 값은 피봇 앞, 큰 값은 피봇 뒤로 간다.
작은 값 pivot 큰 값
그러나 pivot이 가장 작거나 가장 크다면 시간이 오래 걸린다.
31 8 48 73 11 3 20 29 65 15 중에서 15를 pivot으로 한다.
8 11 3 15 31 48 20 29 65 73 pivot의 왼쪽과 오른쪽을 정렬한다.
3 8 11 15 20 29 31 48 65 73 합병 과정이 필요 없다.
def quicksort(A,p,r):
if p<r:
q=partition(A,p,r) #q는 pivot
quicksort(A,p,q-1) #왼쪽 정렬
quicksort(A,q+1,r) #오른쪽 정렬
def partition(A,p,r):
배열 A의 원소들을 A[r]을 기준으로 양쪽에 재배치하고 A[r]이 자리한 위치를 return 한다.
파이썬을 사용하면 더 간결하게 표현할 수 있다. 다른 블로그를 보니 이런 코드가 있었다. 파이썬 멋있다.
arr=[31,8,48,73,11,3,20,29,65,15]
def quicksort(arr):
if len(arr)<2:return arr
pivot = arr[-1]
left=[]
right=[]
center=[]
for i in arr:
if i<pivot:
left.append(i)
elif i>pivot:
right.append(i)
elif i==pivot:
center.append(i)
return quicksort(left)+center+quicksort(right)
print(quicksort(arr))
'알고리즘' 카테고리의 다른 글
힙의 다른 응용: 우선순위 큐 priority queue (0) | 2018.02.09 |
---|---|
힙 정렬 heap sort (0) | 2018.02.05 |
합병 정렬 merge sort (0) | 2018.02.03 |
기본적인 정렬 알고리즘 (0) | 2018.02.03 |
멱집합 powerset (0) | 2018.02.02 |