Quick Sort

  • ์ฃผ์–ด์ง„ ๋ฐฐ์—ด์„ ๋‘ ๊ฐœ๋กœ ๋ถ„ํ• ํ•˜๊ณ , ๊ฐ๊ฐ์„ ์ •๋ ฌํ•œ๋‹ค

  • ๋ณ‘ํ•ฉ ์ •๋ ฌ๊ณผ ๋‹ค๋ฅธ ์ 

    1. ๋ณ‘ํ•ฉ ์ •๋ ฌ์€ ๊ทธ๋ƒฅ ๋‘ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆ„๋Š” ๋ฐ˜๋ฉด์—, ํ€ต ์ •๋ ฌ์€ ๋ถ„ํ• ํ•  ๋•Œ, ๊ธฐ์ค€ ์•„์ดํ…œ(pivot item) ์ค‘์‹ฌ์œผ๋กœ, ์ด๋ณด๋‹ค ์ž‘์€ ๊ฒƒ์€ ์™ผํŽธ, ํฐ ๊ฒƒ์€ ์˜ค๋ฅธํŽธ์— ์œ„์น˜์‹œํ‚จ๋‹ค

    2. ๊ฐ ๋ถ€๋ถ„ ์ •๋ ฌ์ด ๋๋‚œ ํ›„, ๋ณ‘ํ•ฉ์ •๋ ฌ์„ "๋ณ‘ํ•ฉ"์ด๋ž€ ํ›„์ฒ˜๋ฆฌ ์ž‘์—…์ด ํ•„์š”ํ•˜๋‚˜, ํ€ต ์ •๋ ฌ์€ ํ•„์š”๋กœ ํ•˜์ง€ ์•Š๋Š”๋‹ค.

  • ์‹œ๊ฐ„ ๋ณต์žก๋„

    • nlogn

Hoare-Partition ์•Œ๊ณ ๋ฆฌ์ฆ˜

์•„์ด๋””์–ด

  • P(pivot) ๊ฐ’๋“ค ๋ณด๋‹ค ํฐ ๊ฐ’์€ ์˜ค๋ฅธ์ชฝ, ์ž‘์€ ๊ฐ’๋“ค์€ ์™ผ์ชฝ ์ง‘ํ•ฉ์— ์œ„์น˜ํ•˜๋„๋ก ํ•œ๋‹ค

  • Pivot์„ ๋‘ ์ง‘ํ•ฉ์˜ ๊ฐ€์šด๋ฐ์— ์œ„์น˜์‹œํ‚จ๋‹ค

ํ”ผ๋ด‡ ์„ ํƒ

  • ์™ผ์ชฝ ๋ / ์˜ค๋ฅธ์ชฝ ๋ / ์ž„์˜์˜ ์„ธ ๊ฐœ ๊ฐ’ ์ค‘์— ์ค‘๊ฐ„ ๊ฐ’

ex)

def quick_sort (arr, left, right):
    # pivot ์œ„์น˜ ๊ฒฐ์ • (pivot์„ ๊ธฐ์ค€์œผ๋กœ ํฐ ๊ฐ’์€ ์˜ค๋ฅธ์ชฝ, ์ž‘์€ ๊ฐ’์€ ์™ผ์ชฝ์œผ๋กœ ๊ตฌ๋ถ„)
    # ์™ผ์ชฝ ๋ถ€๋ถ„์ง‘ํ•ฉ ์ •๋ ฌ
    # ์˜ค๋ฅธ์ชฝ ๋ถ€๋ถ„์ง‘ํ•ฉ ์ •๋ ฌ
    if left > right:
        return
    # ํ”ผ๋ด‡ ๊ตฌํ•˜๊ธฐ
    pivot = lomuto_partition(arr, left, right)
    pivot = hoare_partition(arr, left, right)
    # ์™ผ์ชฝ ๋ถ€๋ถ„์ง‘ํ•ฉ ์ •๋ ฌ ์‹คํ–‰
    quick_sort(arr, left, pivot-1)
    # ์˜ค๋ฅด์ชฝ ๋ถ€๋ถ„์ง‘ํ•ฉ ์ •๋ ฌ ์‹คํ–‰
    quick_sort(arr,pivot+1, right)

def lomuto_partition(arr, left, right):
    # ๋งจ ์˜ค๋ฅธ์ชฝ ์š”์†Œ๋ฅผ pivot์œผ๋กœ ์„ค์ •ํ•˜๊ณ ,
    # i = left -1
    # j = left
    pivot = arr[right]
    i = left -1

    for j in range(left, right):
        # arr[i] ๊ฐ€ pivot๋ณด๋‹ค ์ž‘์œผ๋ฉด,
        if arr[j] < pivot:
            # i๋ฅผ 1 ์ฆ๊ฐ€
            # arr[j], arr[i] ์œ„์น˜ ๊ตํ™˜
            i += 1
            arr[i], arr[j] = arr[j], arr[i]

    # i๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ์œ„์น˜๊ฐ€ pivot๋ณด๋‹ค ์ž‘์€ ๊ฐ’์˜ ๋งˆ์ง€๋ง‰ ์ธ๋ฑ์Šค
    # i + 1 ์˜ ์œ„์น˜์— pivot์„ ๋‘๊ณ  i+1 ๋ฐ˜ํ™˜
    arr[i+1], arr[right] = arr[right], arr[i+1]
    
    return i+1

def hoare_partition(arr, left, right):
    # i, j ์„ค์ •ํ•˜๊ณ , ํฐ๊ฐ’ & ์ž‘์€ ๊ฐ’ ์ฐพ์•„์„œ ์œ„์น˜ ๋ฐ”๊ฟ”์ฃผ๊ธฐ
    i = left
    j = right
    pivot = arr[left]

    # i๊ฐ€ j๋ณด๋‹ค ์ž‘์„ ๋•Œ ๊นŒ์ง€ ๊ฒŒ์†ํ•ด์„œ ๋ฐ˜๋ณต
    while i <= j:
        # pivot ๋ณด๋‹ค ํฐ ๊ฐ’์ด ๋‚˜์˜ฌ ๋•Œ ๊นŒ์ง€ i ์ฆ๊ฐ€
        while i<=j and arr[i] <= pivot:
            i += 1
        # pivot ๋ณด๋‹ค ์ž‘์€ ๊ฐ’์ด ๋‚˜์˜ฌ ๋•Œ ๊นŒ์ง€ j ๊ฐ์†Œ
        while i <=j and arr[j] >= pivot:
            j -= 1
        
        # i๊ฐ€ j๋ณด๋‹ค ์ž‘์œผ๋ฉด, ์œ„์น˜ ๊ตํ™˜
        if i < j:
            arr[i], arr[j] = arr[j], arr[i]
    
    arr[left], arr[j] = arr[j], arr[left]
    return j # pivot ์œ„์น˜์ธ j ๋ฐ˜ํ™˜

arr = [4,6,3,6,8,0,3,8,10]
quick_sort(arr, 0, len(arr)-1)
print(arr)

Last updated

Was this helpful?