Algorithm/모두의 알고리즘 with Python

[탐색과 정렬] 퀵 정렬

비번변경 2021. 10. 4. 20:04

퀵 정렬(Quick sort)

기준값과 비교하여 그룹을 나눈 후, 각각 재귀 호출하여 결과를 합치는 정렬 방식으로 분할 정복 알고리즘(Divide and conquer algorithm)의 하나이다. 아래 그림과 같은 방식으로 동작한다.

퀵 정렬(Quick sort)

퀵 정렬은 얼마나 적절한 기준을 정하느냐에 따라 성능이 크게 좌우된다.

평균적인 계산 복잡도는 $$ \mbox{O}(n\log{n}) $$

 

 

코드 (캐시 사용)

def quick_sort(a):
    n = len(a)

    # 종료 조건
    if n <= 1:
        return a

    # 기준 값을 정하고 기준에 맞춰 그룹을 나누는 과정
    pivot = a[-1]  # 편의상 리스트의 마지막 값을 기준 값으로 정함
    g1 = []        # 그룹 1: 기준 값보다 작은 값을 담을 리스트
    g2 = []        # 그룹 2: 기준 값보다 큰 값을 담을 리스트

    for i in range(0, n - 1):  # 마지막 값은 기준 값이므로 제외
        if a[i] < pivot:       
            g1.append(a[i])    
        else:
            g2.append(a[i])   

    return quick_sort(g1) + [pivot] + quick_sort(g2) # 리스트 합치기​

 

 

코드 (캐쉬 미사용)

def partition(list, start, end):
    if end - start <= 0:
        return
        
    pivot = list[end]
    i = start
    
    for j in range(start, end):
        if list[j] < pivot:
            list[i], list[j] = list[j], list[i]
            i += 1
    list[i], list[end] = list[end], list[i]
    
    partition(list, start, i - 1)
    partition(list, i + 1, end)


def quick_sort(list):
    return partition(list, 0, len(list) - 1)​


partition 함수 동작 모습은 아래와 같다.

partition 함수

 

 

참고 문서

https://itstory.tk/entry/%ED%80%B5%EC%A0%95%EB%A0%ACQuick-Sort

728x90