๐Ÿโ˜˜๏ธ๐Ÿ๐Ÿฅฌ๐Ÿฅฆ๐ŸŒณ๐ŸŒฒ
์นดํ…Œ๊ณ ๋ฆฌ
์ž‘์„ฑ์ผ
2023. 6. 13. 09:20
์ž‘์„ฑ์ž
ห—ห‹ เญจเญง หŠห—

ํ€ต ์ •๋ ฌ(Quick Sort)

  • ๋ถ„ํ•  ์ •๋ณต ์•Œ๊ณ ๋ฆฌ์ฆ˜(์ •๋ณต ํ›„ ๋ถ„ํ• )
  • ๊ธฐ์ค€ ๋ฐ์ดํ„ฐ(Pivot)๋ฅผ ์„ค์ •ํ•˜๊ณ  ๊ทธ ๊ธฐ์ค€๋ณด๋‹ค ํฐ ๋ฐ์ดํ„ฐ์™€ ์ž‘์€ ๋ฐ์ดํ„ฐ์˜ ์œ„์น˜๋ฅผ ๋ฐ”๊พธ๋Š” ๋ฐฉ๋ฒ•
  • ์ฒซ ๋ฒˆ์งธ ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ์ค€ ๋ฐ์ดํ„ฐ(Pivot)๋กœ ์„ค์ •

ํ€ต ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ˆ˜ํ–‰๊ณผ์ •

ํ€ต ์ •๋ ฌ์„ ์ˆ˜ํ–‰ํ•  ๋•Œ๋Š” ์™ผ์ชฝ์—์„œ๋ถ€ํ„ฐ ํ”ผ๋ฒ—๋ณด๋‹ค ํฐ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณ ๋ฅด๊ณ , ์˜ค๋ฅธ์ชฝ์—์„œ๋ถ€ํ„ฐ ํ”ผ๋ฒ—๋ณด๋‹ค ์ž‘์€ ๋ฐ์ดํ„ฐ ๊ณ ๋ฆ„

[Step 0]

  • Pivot: 5
  • ์™ผ์ชฝ์—์„œ๋ถ€ํ„ฐ '5'๋ณด๋‹ค ํฐ ๋ฐ์ดํ„ฐ๋ฅผ ์„ ํƒํ•˜๋ฏ€๋กœ '7'์ด ์„ ํƒ๋จ
  • ์˜ค๋ฅธ์ชฝ์—์„œ๋ถ€ํ„ฐ '5'๋ณด๋‹ค ์ž‘์€ ๋ฐ์ดํ„ฐ๋ฅผ ์„ ํƒํ•˜๋ฏ€๋กœ '4'๊ฐ€ ์„ ํƒ๋จ
  • ๋‘ ๋ฐ์ดํ„ฐ์˜ ์œ„์น˜๋ฅผ ์„œ๋กœ ๋ณ€๊ฒฝ

[Step 1]

  • Pivot: 5
  • ์™ผ์ชฝ์—์„œ๋ถ€ํ„ฐ '5'๋ณด๋‹ค ํฐ ๋ฐ์ดํ„ฐ๋ฅผ ์„ ํƒํ•˜๋ฏ€๋กœ '9'์ด ์„ ํƒ๋จ
  • ์˜ค๋ฅธ์ชฝ์—์„œ๋ถ€ํ„ฐ '5'๋ณด๋‹ค ์ž‘์€ ๋ฐ์ดํ„ฐ๋ฅผ ์„ ํƒํ•˜๋ฏ€๋กœ '2'๊ฐ€ ์„ ํƒ๋จ
  • ๋‘ ๋ฐ์ดํ„ฐ์˜ ์œ„์น˜๋ฅผ ์„œ๋กœ ๋ณ€๊ฒฝ

[Step 2]

  • Pivot: 5
  • ์™ผ์ชฝ์—์„œ๋ถ€ํ„ฐ '5'๋ณด๋‹ค ํฐ ๋ฐ์ดํ„ฐ๋ฅผ ์„ ํƒํ•˜๋ฏ€๋กœ '6'์ด ์„ ํƒ๋จ
  • ์˜ค๋ฅธ์ชฝ์—์„œ๋ถ€ํ„ฐ '5'๋ณด๋‹ค ์ž‘์€ ๋ฐ์ดํ„ฐ๋ฅผ ์„ ํƒํ•˜๋ฏ€๋กœ '1'๊ฐ€ ์„ ํƒ๋จ
  • ์œ„์น˜๊ฐ€ ์—‡๊ฐˆ๋ฆฌ๋Š” ๊ฒฝ์šฐ ‘Pviot’๊ณผ ‘์ž‘์€ ๋ฐ์ดํ„ฐ’์˜ ์œ„์น˜๋ฅผ ์„œ๋กœ ๋ณ€๊ฒฝ

[๋ถ„ํ•  ์™„๋ฃŒ]

  • ‘5'์˜ ์™ผ์ชฝ์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋Š” ๋ชจ๋‘ 5๋ณด๋‹ค ์ž‘๊ณ , ์˜ค๋ฅธ์ชฝ์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋Š” ๋ชจ๋‘ '5'๋ณด๋‹ค ํผ
  • ๋ถ„ํ• (Divide): ์ด๋ ‡๊ฒŒ ํ”ผ๋ฒ—์„ ๊ธฐ์ค€์œผ๋กœ ๋ฐ์ดํ„ฐ ๋ฌถ์Œ์„ ๋‚˜๋ˆ„๋Š” ์ž‘์—…

[์™ผ์ชฝ ๋ฐ์ดํ„ฐ ๋ฌถ์Œ ์ •๋ ฌ]

  • ์™ผ์ชฝ์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด์„œ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ •๋ ฌ์„ ์ˆ˜ํ–‰

[์˜ค๋ฅธ์ชฝ ๋ฐ์ดํ„ฐ ๋ฌถ์Œ ์ •๋ ฌ]

  • ์˜ค๋ฅธ์ชฝ์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด์„œ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ •๋ ฌ์„ ์ˆ˜ํ–‰

ํ€ต ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์˜์‚ฌ์ฝ”๋“œ

QuickSort(A, left, right)
์ž…๋ ฅ: ๋ฐฐ์—ด A[left]~A[right]
์ถœ๋ ฅ: ์ •๋ ฌ๋œ ๋ฐฐ์—ด A[left]~A[right]
1. if (left < right) {
2. 	ํ”ผ๋ด‡์„ A[left]~A[right] ์ค‘์—์„œ ์„ ํƒํ•˜๊ณ ,   	
		ํ”ผ๋ด‡์„ A[left]์™€ ์ž๋ฆฌ๋ฅผ ๋ฐ”๊พผ ํ›„, 
		ํ”ผ๋ด‡๊ณผ ๋ฐฐ์—ด์˜ ๊ฐ ์›์†Œ๋ฅผ ๋น„๊ตํ•˜์—ฌ ํ”ผ๋ด‡๋ณด๋‹ค ์ž‘์€ 	์ˆซ์ž๋“ค์€ A[left]~A[p-1]๋กœ ์˜ฎ๊ธฐ๊ณ , 
		ํ”ผ๋ด‡๋ณด๋‹ค ํฐ ์ˆซ์ž๋“ค์€ A[p+1]~A[right]๋กœ ์˜ฎ๊ธฐ๋ฉฐ,
		ํ”ผ๋ด‡์€ A[p]์— ๋†“๋Š”๋‹ค.
3. 	QuickSort(A, left, p-1)      // ํ”ผ๋ด‡๋ณด๋‹ค ์ž‘์€ ๊ทธ๋ฃน
4. 	QuickSort(A, p+1 right)     // ํ”ผ๋ด‡๋ณด๋‹ค ํฐ ๊ทธ๋ฃน
      }
  • Line 1
    • ๋ฐฐ์—ด A์˜ ๊ฐ€์žฅ ์™ผ์ชฝ ์›์†Œ์˜ ์ธ๋ฑ์Šค(left)๊ฐ€ ๊ฐ€์žฅ ์˜ค๋ฅธ์ชฝ ์›์†Œ์˜ ์ธ๋ฑ์Šค(right)๋ณด๋‹ค ์ž‘์œผ๋ฉด line2~4์—์„œ ์ •๋ ฌ ์ˆ˜ํ–‰
    • ๋งŒ์•ฝ ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด 1๊ฐœ์˜ ์›์†Œ๋ฅผ ์ •๋ ฌํ•˜๋Š” ๊ฒฝ์šฐ์ž„. 1๊ฐœ์˜ ์›์†Œ๋Š” ์ด๋ฏธ ์ •๋ ฌ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ๊ทธ๋Œ€๋กœ ํ˜ธ์ถœ์„ ๋งˆ์นจ.
  • Line 2
    • A[left]~A[right]์—์„œ ํ”ผ๋ด‡์„ ์„ ํƒํ•˜๊ณ ,
    • ๋ฐฐ์—ด A[left+1]~A[right]์˜ ์›์†Œ๋“ค์„ ํ”ผ๋ด‡๊ณผ ๋น„๊ตํ•˜์—ฌ,
    • ํ”ผ๋ด‡๋ณด๋‹ค ์ž‘์€ ๊ทธ๋ฃน์ธ A[left]~A[p-1]๊ณผ ํ”ผ๋ด‡๋ณด๋‹ค ํฐ ๊ทธ๋ฃน์ธ A[p+1]~A[right]๋กœ ๋ถ„ํ• ํ•˜๊ณ 
    • A[p]์— ํ”ผ๋ด‡์„ ์œ„์น˜์‹œํ‚จ๋‹ค.
    • ์ฆ‰, p๋Š” ํ”ผ๋ด‡์ด ์œ„์น˜ํ•œ ๋ฐฐ์—ด A์˜ ์ธ๋ฑ์Šค์ด๋‹ค.
  • Line 3: ํ”ผ๋ด‡๋ณด๋‹ค ์ž‘์€ ๊ทธ๋ฃน์ธ A[left]~A[p-1]์„ ์žฌ๊ท€์ ์œผ๋กœ ํ˜ธ์ถœ
  • Line 4: ํ”ผ๋ด‡๋ณด๋‹ค ํฐ ๊ทธ๋ฃน์ธ A[p+1]~A[right]์„ ์žฌ๊ท€์ ์œผ๋กœ ํ˜ธ์ถœ

ํ€ต ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ฝ”๋“œ

array = [5, 7, 9, 0, 3, 1, 6, 2, 4, 8]

def quick_sort(array, start, end):
    if start >= end: # ์›์†Œ๊ฐ€ 1๊ฐœ์ธ ๊ฒฝ์šฐ ์ข…๋ฃŒ
        return
    pivot = start # ํ”ผ๋ฒ—์€ ์ฒซ ๋ฒˆ์งธ ์›์†Œ
    left = start + 1
    right = end
    while(left <= right):
        # ํ”ผ๋ฒ—๋ณด๋‹ค ํฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์„ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต 
        while(left <= end and array[left] <= array[pivot]):
            left += 1
        # ํ”ผ๋ฒ—๋ณด๋‹ค ์ž‘์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์„ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต
        while(right > start and array[right] >= array[pivot]):
            right -= 1
        if(left > right): # ์—‡๊ฐˆ๋ ธ๋‹ค๋ฉด ์ž‘์€ ๋ฐ์ดํ„ฐ์™€ ํ”ผ๋ฒ—์„ ๊ต์ฒด
            array[right], array[pivot] = array[pivot], array[right]
        else: # ์—‡๊ฐˆ๋ฆฌ์ง€ ์•Š์•˜๋‹ค๋ฉด ์ž‘์€ ๋ฐ์ดํ„ฐ์™€ ํฐ ๋ฐ์ดํ„ฐ๋ฅผ ๊ต์ฒด
            array[left], array[right] = array[right], array[left]
    # ๋ถ„ํ•  ์ดํ›„ ์™ผ์ชฝ ๋ถ€๋ถ„๊ณผ ์˜ค๋ฅธ์ชฝ ๋ถ€๋ถ„์—์„œ ๊ฐ๊ฐ ์ •๋ ฌ ์ˆ˜ํ–‰
    quick_sort(array, start, right - 1)
    quick_sort(array, right + 1, end)

quick_sort(array, 0, len(array) - 1)
print(array)

ํŒŒ์ด์ฌ์˜ ์žฅ์ ์„ ์‚ด๋ฆฐ ๋ฐฉ์‹

array = [5, 7, 9, 0, 3, 1, 6, 2, 4, 8]

def quick_sort(array):
    # ๋ฆฌ์ŠคํŠธ๊ฐ€ ํ•˜๋‚˜ ์ดํ•˜์˜ ์›์†Œ๋งŒ์„ ๋‹ด๊ณ  ์žˆ๋‹ค๋ฉด ์ข…๋ฃŒ
    if len(array) <= 1:
        return array

    pivot = array[0] # ํ”ผ๋ฒ—์€ ์ฒซ ๋ฒˆ์งธ ์›์†Œ
    tail = array[1:] # ํ”ผ๋ฒ—์„ ์ œ์™ธํ•œ ๋ฆฌ์ŠคํŠธ

    left_side = [x for x in tail if x <= pivot] # ๋ถ„ํ• ๋œ ์™ผ์ชฝ ๋ถ€๋ถ„
    right_side = [x for x in tail if x > pivot] # ๋ถ„ํ• ๋œ ์˜ค๋ฅธ์ชฝ ๋ถ€๋ถ„

    # ๋ถ„ํ•  ์ดํ›„ ์™ผ์ชฝ ๋ถ€๋ถ„๊ณผ ์˜ค๋ฅธ์ชฝ ๋ถ€๋ถ„์—์„œ ๊ฐ๊ฐ ์ •๋ ฌ์„ ์ˆ˜ํ–‰ํ•˜๊ณ , ์ „์ฒด ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฐ˜ํ™˜
    return quick_sort(left_side) + [pivot] + quick_sort(right_side)

print(quick_sort(array))

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

  • ํ”ผ๋ด‡ ์„ ํƒ์ด ์ขŒ์šฐํ•จ. ๋„ˆ๋ฌด ํฌ๊ฑฐ๋‚˜ ๋„ˆ๋ฌด ์ž‘์€ ์ˆซ์ž๊ฐ€ ์„ ํƒ๋˜๋ฉด ํ•œ ๋ถ€๋ถ„์œผ๋กœ ์น˜์šฐ์น˜๋Š” ๋ถ„ํ• ์„ ์•ผ๊ธฐํ•จ
  • ์ตœ์•…์˜ ๊ฒฝ์šฐ: O(n^2)
    • = (n-1)+(n-2)+(n-3)+…+2+1 = n(n-1)/2 = O(n^2)
  • ํ‰๊ท ์˜ ๊ฒฝ์šฐ = ์ตœ์„ ์˜ ๊ฒฝ์šฐ
    • $$O(log_2{n})$$

์„ฑ๋Šฅ ํ–ฅ์ƒ ๋ฐฉ๋ฒ•

  • ์ž…๋ ฅ์˜ ํฌ๊ธฐ๊ฐ€ ๋งค์šฐ ํด ๋•Œ, ํ€ต ์ •๋ ฌ์˜ ์„ฑ๋Šฅ์„ ๋” ํ–ฅ์ƒ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ์‚ฝ์ž… ์ •๋ ฌ์„ ๋™์‹œ์— ์‚ฌ์šฉ