Quick Sort

Jump to Quick Sort ๐Ÿšด

1. About Quick Sort

ํ€ต ์ •๋ ฌ์€ ๋ถ„ํ• [1]๊ณผ ์ •๋ณต[2]์„(Divide and conquer) ์ ๊ทน์ ์œผ๋กœ ํ™œ์šฉํ•œ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.

ํ€ต ์ •๋ ฌ์€ PIVOT์ด๋ผ๋Š” ๊ธฐ์ค€๊ฐ’์ด ์กด์žฌํ•œ๋‹ค. ์ด PIVOT์„ ๊ธฐ์ค€์œผ๋กœ ์ž‘์€ ๊ฐ’์˜ ๋ฒ”์œ„, ํฐ ๊ฐ’์˜ ๋ฒ”์œ„๋กœ ๋‚˜๋ˆ„๋Š” ๋ถ„ํ• &์ •๋ณต ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.

this slowpoke moves

2. Code

case1:

  1. ๋ฆฌ์ŠคํŠธ์˜ ์ค‘์•™์„ pivot์œผ๋กœ ์„ ํƒ.
  2. ์™ผ์ชฝ ๋์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๋ฆฌ์ŠคํŠธ๋ฅผ ์กฐํšŒํ•˜๋ฉฐ ๋ฐœ๊ฒฌ๋œ PIVOT ๋ณด๋‹ค ํฐ ๊ฐ’๊ณผ ์˜ค๋ฅธ์ชฝ ๋์—์„œ ์™ผ์ชฝ์œผ๋กœ ์กฐํšŒํ•˜๋ฉฐ ๋ฐœ๊ฒฌ๋œ PIVOT๋ณด๋‹ค ์ž‘์€ ๊ฐ’์„ SWAP.
  3. ๋‘ ์ง€์ ์ด ๊ต์ฐจํ•  ๋•Œ ๊นŒ์ง€ 1๋ฒˆ๊ณผ 2๋ฒˆ ๊ณผ์ •์„ ๋ฐ˜๋ณต.
  4. ๊ต์ฐจ ์ง€์ ์„ ๊ธฐ์ค€์œผ๋กœ ์™ผ์ชฝ ๋ฆฌ์ŠคํŠธ์™€ ์˜ค๋ฅธ์ชฝ ๋ฆฌ์ŠคํŠธ์— ๋Œ€ํ•ด 1๋ฒˆ๋ถ€ํ„ฐ 3๋ฒˆ๊นŒ์ง€ ๋ฐ˜๋ณต.
def quick_sort(arr):
    def sort(arr, left, right):
        if right <= left:
            return
        mid = partition(arr, left, right)
        sort(arr, left, mid - 1)
        sort(arr, mid, right)
    def partition(arr, left, right):
        print('begin',arr)
        pivot = (left + right) // 2
        while left <= right:
            while arr[left] < arr[pivot]:
                # pivot ๋ณด๋‹ค ํฐ ๊ฐ’์„ ๊ฐ€์ง„ ์ธ๋ฑ์Šค๋ฅผ ์ฐพ๋Š”๋‹ค.
                left += 1
            while arr[right] > arr[pivot]:
                # pivot ๋ณด๋‹ค ์ž‘์€ ๊ฐ’์„ ๊ฐ€์ง„ ์ธ๋ฑ์Šค๋ฅผ ์ฐพ๋Š”๋‹ค.
                right -= 1
            if left <= right:
                arr[right], arr[left] = arr[left], arr[right]
                right -= 1
                left += 1
            print('ing',arr, left, right)
        return left
    sort(arr, 0, len(arr) - 1)
x = [0,1]
quick_sort(x)
print(x)

2.1. ๋””ํ…Œ์ผ ์กฐ๊ฑด

ํ€ต์ •๋ ฌ ์ฒ˜๋Ÿผ ๊ตฌํ˜„ ๊ณผ์ •์—์„œ while๋กœ ๋ฐ˜๋ณต๋ฌธ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒฝ์šฐ์™€ ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ ์ข…๋ฃŒ์กฐ๊ฑด์„ ๋งค์šฐ ์—„๋ฐ€ํ•˜๊ฒŒ ์„ค์ •ํ•ด ์ฃผ์–ด์•ผ ํ•œ๋‹ค.

  1. ์žฌ๊ท€ํ•จ์ˆ˜์˜ ์ข…๋ฃŒ์กฐ๊ฑด: ์ฒ˜์Œ ๋ฆฌ์ŠคํŠธ๊ฐ€ ๋ถ„ํ• ๋˜๋ฉฐ left์™€ right๊ฐ€ ๊ฐ™์•„์ง€๋Š” ์ˆœ๊ฐ„์ด ๋”์ด์ƒ ๋ถ„ํ• ๋  ์ˆ˜ ์—†๋Š” ์ข…๋ฃŒ์กฐ๊ฑด์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ right๊ฐ€ left๋ณด๋‹ค ์ž‘์•„์ง€๋Š” ์ˆœ๊ฐ„์ด ๋ฐœ์ƒํ•œ๋‹ค.

์˜ˆ์‹œ

'''in quick_sort function'''
mid = partition(arr, left, right) # left = 0, right = 1
sort(arr, left, mid - 1) # left = 1, mid = 0
sort(arr, mid, right)

'''in partition method'''
if left <= right:
    print(left,right)
    arr[right], arr[left] = arr[left], arr[right]
    right -= 1
    left += 1
return right # 0 => mid๊ฐ€ ๋จ
  • left์™€ right๊ฐ€ ๊ฐ™์€ ๊ฒฝ์šฐ๋Š” ์ด๋ฏธ return์„ ์‹œํ‚ค๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ œ์™ธํ•œ๋‹ค.
  • left๊ฐ€ 0์ด๊ณ  right ๊ฐ€ 1์ธ ๊ฒฝ์šฐ๋ฅผ ์‚ดํŽด๋ณด์ž. ์ด๋ถ€๋ถ„์—์„œ ์ •๋ ฌ์ด ๋˜์–ด์žˆ๋Š” ๊ฒฝ์šฐ๋ผ๋ฉด right๊ฐ€ ์™ผ์ชฝ์œผ๋กœ ์ด๋™ํ•ด์„œ 0์˜ ์œ„์น˜์— ์žˆ๊ฒŒ ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  left์™€ right๊ฐ€ ๊ฐ™๊ธฐ ๋•Œ๋ฌธ์— ์กฐ๊ฑด๋ฌธ์—์„œ ์žฌ์ž๋ฆฌ ์Šค์™‘์ด ์ผ์–ด๋‚˜๋Š” ๋™์‹œ์— left๋Š” 1 right๋Š” -1 ์ด ๋œ๋‹ค. ๋”ฐ๋ผ์„œ mid๋Š” ๊ธฐ์กด left์˜ -1 ์ด ๋œ ์ƒํƒœ๋กœ ๋ฐ˜ํ™˜๋œ๋‹ค. ์ฆ‰ left๋Š” 0 mid ๋Š” -1์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ข…๋ฃŒ ์กฐ๊ฑด๋ฌธ์„ right <= left๋กœ ์ˆ˜์ •ํ•ด ์ฃผ์–ด์•ผ ํ•œ๋‹ค.
  • ํ•˜์ง€๋งŒ ๋งŒ์•ฝ return left๋ฅผ ํ•ด์ค€๋‹ค๋ฉด, mid๋Š” ๊ธฐ์กด left๋ณด๋‹ค 1 ์ปค์ง„ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ mid๊ฐ€ 1๊ฐ€ ๋˜๊ณ  ๋‹ค์Œ ํ€ต์ •๋ ฌ์˜ ์™ผ์ชฝ ๋ฒ”์œ„๋Š” sort(arr, left, mid - 1)๋กœ left(0), mid(1) - 1 ์ด๊ธฐ ๋•Œ๋ฌธ์— == ์กฐ๊ฑด์—์„œ ํƒˆ์ถœ๋œ๋‹ค. ๋˜ํ•œ ๋‹ค์Œ ํ€ต์ •๋ ฌ์˜ ์˜ค๋ฅธ์ชฝ ๋ฒ”์œ„๋Š” sort(arr, mid, right)๋กœ mid(1) right(1)์ด๊ธฐ ๋•Œ๋ฌธ์— == ์กฐ๊ฑด์—์„œ ํƒˆ์ถœํ•˜๊ฒŒ ๋œ๋‹ค.
while left <= right:
    while arr[left] < arr[pivot]: # pivot ๋ณด๋‹ค ํฐ ๊ฐ’์„ ๊ฐ€์ง„ ์ธ๋ฑ์Šค๋ฅผ ์ฐพ๋Š”๋‹ค.
        left += 1
    while arr[right] > arr[pivot]: # pivot ๋ณด๋‹ค ์ž‘์€ ๊ฐ’์„ ๊ฐ€์ง„ ์ธ๋ฑ์Šค๋ฅผ ์ฐพ๋Š”๋‹ค.
        right -= 1
  • ๋งŒ์•ฝ if left <= right๋ฅผ if left < right๋กœ ์ˆ˜์ •ํ•ด์ฃผ๋ฉด ์–ด๋–ค ์ผ์ด ๋ฐœ์ƒํ• ๊นŒ? left์™€ right๊ฐ€ ๊ฐ™์•„์ง€๋Š” ์ˆœ๊ฐ„ while ๋ฌธ์„ ๋ฒ—์–ด๋‚  ์ˆ˜ ์—†๊ฒŒ ๋œ๋‹ค. => left <= right ์กฐ๊ฑด์—์„œ๋„ ๋ฐ˜๋ณต๋˜๊ธฐ ๋•Œ๋ฌธ์—.
  • ์ด ๋•Œ ์œ„์˜ ์กฐ๊ฑด์„ ํƒˆ์ถœํ•˜๊ธฐ ์œ„ํ•ด while left < right๋กœ ๋ฐ”๊ฟ”์ฃผ๋ฉด, left๊ฐ€ 0 right๊ฐ€ 1์ฒ˜๋Ÿผ 1 ์ธ๋ฑ์Šค๊ฐ€ ์ฐจ์ด๋‚˜๊ณ  ์ •๋ ฌ์ด ๋˜์–ด์žˆ๋Š” ๊ฒฝ์šฐ๋ผ๋ฉด, partition์˜ ์•ˆ์ชฝ์—์„œ๋Š” left์™€ right๊ฐ€ ๋ชจ๋‘ 0์ด ๋˜๋Š” ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•œ๋‹ค. ์ด๋•Œ mid๋Š” left์™€ ๊ฐ™์•„์€ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ฆ‰ sort(arr, mid, right)๋Š” ๊ณ„์† 0๊ณผ 1์„ ์ž…๋ ฅํ•˜๊ฒŒ ๋˜์–ด ์žฌ๊ท€๋ฌธ์„ ๋น ์ ธ๋‚˜๊ฐˆ ์ˆ˜ ์—†๊ฒŒ ๋œ๋‹ค. => `sort(arr, mid, right)๋Š” mid๊ฐ€ left์™€ ๊ฐ™์•„์ง€๋Š” ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•˜๋ฉด ๋ฌด์กฐ๊ฑด ์žฌ๊ท€์— ๋น ์ง€๊ฒŒ ๋œ๋‹ค.

์ฃผ์„:

[1] ๋ถ„ํ• : ์ปค๋‹ค๋ž€ ๋ฌธ์ œ๋ฅผ ์ž‘์€ ๋ฌธ์ œ๋กœ ๋‚˜๋ˆ„์–ด ํ•ด๊ฒฐํ•˜๋Š” ๊ณผ์ •

[2] ์ •๋ณต: ๋ถ„ํ• ๋œ ๋ถ€๋ถ„์„ ํŠน์ • ๊ธฐ์ค€์— ๋งž๊ฒŒ ๋งŒ๋“ค์–ด ๊ฐ€๋Š” ๊ณผ์ •

์ฐธ์กฐ:

  1. quicksort-wikipedia

Written by@[Tory]
I explain with words and code. I explain with words and code. I explain with words and code.