본문 바로가기
  • 살짝 구운 김 유나
Algorithm

퀵 정렬

by yunae 2022. 9. 26.

퀵 정렬

: 주어진 배열을 두 개로 분할하고, 각각을 정렬한다

 

 

병합 정렬과의 차이점

1. 퀵 정렬은 분할 시에 pivot item을 중심으로, 이보다 작은 것은 왼편, 큰 것은 오른편에 위치시킨다.

2. 각 부분 정렬이 끝난 후, 병합 정렬은 병합하는 과정이 필요하나 퀵 정렬은 후처리가 필요하지 않다.

 

 

 

아이디어

- pivot보다 큰 값은 오른쪽, 작은 값들은 왼쪽 집합에 위치하도록 한다.

- 피봇을 두 집합의 가운데에 위치시킨다.

 

 

 

구현

def partition(l, r):
    
    # 피봇을 A[l]로 설정
    pivot = A[l]
    i, j = l, r
    
    # i, j가 교차하면 i, j는 피봇을 기준으로 작은 값과 큰 값들의 경계에 위치
    while i <= j:
        
        # 피봇보다 큰 값을 발견할때 까지 i+1
        while i <= j and A[i] <= pivot:
            i += 1
        
        # 맨 오른쪽 원소부터 피봇보다 작은 값을 발견할때까지 j-1
        while i <= j and A[j] >= pivot:
            j -= 1  
        
        # 두 원소가 떨어져 있다면 두 원소 swap
        if i < j:
            A[i], A[j] = A[j], A[i]

    # 작은 값과 큰 값의 경계가 되는 위치로 피봇 보내기
    A[l], A[j] = A[j], A[l]
    
    return j



def qsort(l, r):
    if l < r:
        s = partition(l, r)
        qsort(l, s-1)
        qsort(s+1, r)
        
        

A = [7, 2, 5, 3, 4, 5]
N = len(A)
qsort(0, N-1)
print(A)


'''
[2, 3, 4, 5, 5, 7]
'''

 

 

 

 

 

'Algorithm' 카테고리의 다른 글

최소 비용 신장트리(MST) - Prim  (0) 2022.09.28
이진 검색  (0) 2022.09.27
병합 정렬  (0) 2022.09.26
조합  (0) 2022.09.21
순열과 부분집합  (0) 2022.09.21

댓글