• 분할(Divide) : 해결할 문제를 여러 개의 작은 부분으로 나눈다.
  • 정복(Conquer) : 나눈 작은 문제를 각각 해결한다.
  • 통합(Combine) : (필요하다면) 해결된 해답을 모은다.

def Power(Base, Exponent):
    if Base == 0:
        return 1
    result = 1              # Base^0은 1
 
    for i in range(Exponent):
        result *= Base
    return result

  • C^8 = ((C^2)^2)^2

  • C^n

    • n은 짝수일 때 : C^(1/2)*C^(1/2)
    • n은 홀수일 때 : C^(1/2)*C^(1/2)*C
def Power(Base, Exponent):
    if Exponent==0 or Base==0:
        return 1
 
    if Exponent%2 == 0:
        NewBase = Power(Base, Exponent/2)
        return NewBase**2
 
    else:
        NewBase = Power(Base, (Exponent-1)/2)
        return (NewBase**2) * Base
  • 분할정복 기반 알고리즘의 시간 복잡도 : O(logn)

  • 주어진 배열을 두 개로 분할 후 각각 정렬

합병정렬과 같지 않나?

  • 나누기

    • 합병정렬 : 그냥 두 부분으로 나눔
    • 퀵정렬 : 분할 할 때 기준 아이템(pivot item) 중심으로, 이보다 작은 것은 왼편, 큰 것은 오른편으로 위치
  • 후처리

    • 합병정렬 : 합병 후처리 필요
    • 퀵정렬 : 필요 X

def quickSort(a, begin, end):
    if begin < end:
        p = partition(a, begin, end)
        quickSort(a, begin, p-1)
        quickSort(a, p+1, end)
 
def partition(a, begin, end):
    pivot = (begin + end) // 2
    L = begin
    R = end
    while L < R:
        while(L<R and a[L]<a[pivot]):
            L += 1
        while(L<R and a[R]>=a[pivot]):
            R -= 1
        if L < R:                        # 양 쪽의 구간에서 적절한 원소를 찾는 경우
            if L==pivot:
                pivot = R
            a[L], a[R] = a[R], a[L]
    a[pivot], a[R] = a[R], a[pivot]      # 자리 교환
    return R
 
N = 8
a = [4, 67, 23, 21, 2, 5, 64, 34]
quickSort(a, 0, N)

  • 퀵 정렬의 평균 복잡도는 O(nlogn)로 평균적으로는 가장 빠른 편
  • 최악의 시간 복잡도는 O(n2)로, 합병정렬에 비해 비효율적