[Algorithm]Sorting Algorithms(2) - Quick, Merge, Heap Sort

Michelle Kimยท2025๋…„ 1์›” 30์ผ

Algorithm-CodingTest

๋ชฉ๋ก ๋ณด๊ธฐ
10/10

๐ŸฆŠ Quick Sort

๐Ÿ‘‰ Abstract

Quick Sort์€ ๋ถ„ํ•  ์ •๋ณต(divide and conquer) ๋ฐฉ๋ฒ• ์„ ํ†ตํ•ด ์ฃผ์–ด์ง„ ๋ฐฐ์—ด์„ ์ •๋ ฌํ•œ๋‹ค.

  • [๋ถ„ํ•  ์ •๋ณต(divide and conquer) ๋ฐฉ๋ฒ•]
    ๋ฌธ์ œ๋ฅผ ์ž‘์€ 2๊ฐœ์˜ ๋ฌธ์ œ๋กœ ๋ถ„๋ฆฌํ•˜๊ณ  ๊ฐ๊ฐ์„ ํ•ด๊ฒฐํ•œ ๋‹ค์Œ, ๊ฒฐ๊ณผ๋ฅผ ๋ชจ์•„์„œ ์›๋ž˜์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ์ „๋žต์ด๋‹ค.
    Quick Sort์€ ๋ถˆ์•ˆ์ • ์ •๋ ฌ์— ์†ํ•˜๋ฉฐ, ๋‹ค๋ฅธ ์›์†Œ์™€์˜ ๋น„๊ต๋งŒ์œผ๋กœ ์ •๋ ฌ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋น„๊ต ์ •๋ ฌ์— ์†ํ•œ๋‹ค. ๋˜ํ•œ Merge Sort์™€ ๋‹ฌ๋ฆฌ Quick Sort๋Š” ๋ฐฐ์—ด์„ ๋น„๊ท ๋“ฑํ•˜๊ฒŒ ๋ถ„ํ• ํ•œ๋‹ค.

๐Ÿ‘‰ Process (Ascending)

  1. ๋ฐฐ์—ด ๊ฐ€์šด๋ฐ์„œ ํ•˜๋‚˜์˜ ์›์†Œ๋ฅผ ๊ณ ๋ฅธ๋‹ค. ์ด๋ ‡๊ฒŒ ๊ณ ๋ฅธ ์›์†Œ๋ฅผ ํ”ผ๋ฒ—(pivot) ์ด๋ผ๊ณ  ํ•œ๋‹ค.
  2. ํ”ผ๋ฒ— ์•ž์—๋Š” ํ”ผ๋ฒ—๋ณด๋‹ค ๊ฐ’์ด ์ž‘์€ ๋ชจ๋“  ์›์†Œ๋“ค์ด ์˜ค๊ณ , ํ”ผ๋ฒ— ๋’ค์—๋Š” ํ”ผ๋ฒ—๋ณด๋‹ค ๊ฐ’์ด ํฐ ๋ชจ๋“  ์›์†Œ๋“ค์ด ์˜ค๋„๋ก ํ”ผ๋ฒ—์„ ๊ธฐ์ค€์œผ๋กœ ๋ฐฐ์—ด์„ ๋‘˜๋กœ ๋‚˜๋ˆˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๋ฐฐ์—ด์„ ๋‘˜๋กœ ๋‚˜๋ˆ„๋Š” ๊ฒƒ์„ ๋ถ„ํ• (Divide) ์ด๋ผ๊ณ  ํ•œ๋‹ค. ๋ถ„ํ• ์„ ๋งˆ์นœ ๋’ค์— ํ”ผ๋ฒ—์€ ๋” ์ด์ƒ ์›€์ง์ด์ง€ ์•Š๋Š”๋‹ค.
  3. ๋ถ„ํ• ๋œ ๋‘ ๊ฐœ์˜ ์ž‘์€ ๋ฐฐ์—ด์— ๋Œ€ํ•ด ์žฌ๊ท€(Recursion)์ ์œผ๋กœ ์ด ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•œ๋‹ค.
  • ์žฌ๊ท€ ํ˜ธ์ถœ์ด ํ•œ๋ฒˆ ์ง„ํ–‰๋  ๋•Œ๋งˆ๋‹ค ์ตœ์†Œํ•œ ํ•˜๋‚˜์˜ ์›์†Œ๋Š” ์ตœ์ข…์ ์œผ๋กœ ์œ„์น˜๊ฐ€ ์ •ํ•ด์ง€๋ฏ€๋กœ, ์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋ฐ˜๋“œ์‹œ ๋๋‚œ๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ‘‰ Code

  • ์ •๋ณต (Conquer)

๋ถ€๋ถ„ ๋ฐฐ์—ด์„ ์ •๋ ฌํ•œ๋‹ค. ๋ถ€๋ถ„ ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๊ฐ€ ์ถฉ๋ถ„ํžˆ ์ž‘์ง€ ์•Š์œผ๋ฉด ์ˆœํ™˜ ํ˜ธ์ถœ์„ ์ด์šฉํ•˜์—ฌ ๋‹ค์‹œ ๋ถ„ํ•  ์ •๋ณต ๋ฐฉ๋ฒ•์„ ์ ์šฉํ•œ๋‹ค.

  • ๋ถ„ํ•  (Divide)

์ž…๋ ฅ ๋ฐฐ์—ด์„ ํ”ผ๋ฒ—์„ ๊ธฐ์ค€์œผ๋กœ ๋น„๊ท ๋“ฑํ•˜๊ฒŒ 2๊ฐœ์˜ ๋ถ€๋ถ„ ๋ฐฐ์—ด (ํ”ผ๋ฒ—์„ ์ค‘์‹ฌ์œผ๋กœ ์™ผ์ชฝ : ํ”ผ๋ฒ—๋ณด๋‹ค ์ž‘์€ ์š”์†Œ๋“ค, ์˜ค๋ฅธ์ชฝ : ํ”ผ๋ฒ—๋ณด๋‹ค ํฐ ์š”์†Œ๋“ค) ๋กœ ๋ถ„ํ• ํ•œ๋‹ค.

1.

# Partition function
def partition(arr, low, high):
    
    # Choose the pivot
    pivot = arr[high]
    
    # Index of smaller element and indicates 
    # the right position of pivot found so far
    i = low - 1
    
    # Traverse arr[low..high] and move all smaller
    # elements to the left side. Elements from low to 
    # i are smaller after every iteration
    for j in range(low, high):
        if arr[j] < pivot:
            i += 1
            swap(arr, i, j)
    
    # Move pivot after smaller elements and
    # return its position
    swap(arr, i + 1, high)
    return i + 1

# Swap function
def swap(arr, i, j):
    arr[i], arr[j] = arr[j], arr[i]

# The QuickSort function implementation
def quickSort(arr, low, high):
    if low < high:
        
        # pi is the partition return index of pivot
        pi = partition(arr, low, high)
        
        # Recursion calls for smaller elements
        # and greater or equals elements
        quickSort(arr, low, pi - 1)
        quickSort(arr, pi + 1, high)

# Main driver code
if __name__ == "__main__":
    arr = [10, 7, 8, 9, 1, 5]
    n = len(arr)

    quickSort(arr, 0, n - 1)
    
    for val in arr:
        print(val, end=" ")

2.

def quick_sort(arr):
    if len(arr) <= 1:
        return arr  # ์›์†Œ๊ฐ€ ํ•˜๋‚˜ ์ดํ•˜์ด๋ฉด ์ •๋ ฌ๋œ ์ƒํƒœ์ด๋ฏ€๋กœ ๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜
    
    pivot = arr[len(arr) // 2]  # ํ”ผ๋ฒ— ์„ ํƒ (๊ฐ€์šด๋ฐ ๊ฐ’)
    left = [x for x in arr if x < pivot]  # ํ”ผ๋ฒ—๋ณด๋‹ค ์ž‘์€ ๊ฐ’๋“ค
    middle = [x for x in arr if x == pivot]  # ํ”ผ๋ฒ—๊ณผ ๊ฐ™์€ ๊ฐ’๋“ค
    right = [x for x in arr if x > pivot]  # ํ”ผ๋ฒ—๋ณด๋‹ค ํฐ ๊ฐ’๋“ค
    
    return quick_sort(left) + middle + quick_sort(right)

# ํ…Œ์ŠคํŠธ
arr = [3, 6, 8, 10, 1, 2, 1]
print(quick_sort(arr))  # [1, 1, 2, 3, 6, 8, 10]

๐Ÿ‘‰ ์‹œ๊ฐ„๋ณต์žก๋„

  • ์ตœ์ƒ์˜ ๊ฒฝ์šฐ: (ฮฉ(n log n)), ํ”ผ๋ฒ— ์š”์†Œ๊ฐ€ ๋ฐฐ์—ด์„ ๋‘ ๊ฐœ์˜ ๋™์ผํ•œ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆŒ ๋•Œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
  • ํ‰๊ท ์  ๊ฒฝ์šฐ (ฮธ(n log n)), ํ‰๊ท ์ ์œผ๋กœ ํ”ผ๋ฒ—์€ ๋ฐฐ์—ด์„ ๋‘ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆ„์ง€๋งŒ ๋ฐ˜๋“œ์‹œ ๊ฐ™์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ตœ์•…์˜ ๊ฒฝ์šฐ: (O(nยฒ)), ํ•ญ์ƒ ๊ฐ€์žฅ ์ž‘์€ ์š”์†Œ๋‚˜ ๊ฐ€์žฅ ํฐ ์š”์†Œ๊ฐ€ ํ”ผ๋ฒ—์œผ๋กœ ์„ ํƒ๋˜๋Š” ๊ฒฝ์šฐ(์˜ˆ: ์ •๋ ฌ๋œ ๋ฐฐ์—ด) ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ‘‰ ๊ณต๊ฐ„๋ณต์žก๋„

์ฃผ์–ด์ง„ ๋ฐฐ์—ด ์•ˆ์—์„œ ๊ตํ™˜(swap)์„ ํ†ตํ•ด, ์ •๋ ฌ์ด ์ˆ˜ํ–‰๋˜๋ฏ€๋กœ O(n)์ด๋‹ค.

๐Ÿ‘‰ ์žฅ์  & ๋‹จ์ 

์žฅ์ 

  • ๋ถˆํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ์˜ ์ด๋™์„ ์ค„์ด๊ณ  ๋จผ ๊ฑฐ๋ฆฌ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ตํ™˜ํ•  ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ํ•œ ๋ฒˆ ๊ฒฐ์ •๋œ ํ”ผ๋ฒ—๋“ค์ด ์ถ”ํ›„ ์—ฐ์‚ฐ์—์„œ ์ œ์™ธ๋˜๋Š” ํŠน์„ฑ ๋•Œ๋ฌธ์—, ์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ O(nlogโ‚‚n)๋ฅผ ๊ฐ€์ง€๋Š” ๋‹ค๋ฅธ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ๋น„๊ตํ–ˆ์„ ๋•Œ๋„ ๊ฐ€์žฅ ๋น ๋ฅด๋‹ค.
  • ์ •๋ ฌํ•˜๊ณ ์ž ํ•˜๋Š” ๋ฐฐ์—ด ์•ˆ์—์„œ ๊ตํ™˜ํ•˜๋Š” ๋ฐฉ์‹์ด๋ฏ€๋กœ, ๋‹ค๋ฅธ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ํ•„์š”๋กœ ํ•˜์ง€ ์•Š๋Š”๋‹ค.

๋‹จ์ 

  • ๋ถˆ์•ˆ์ • ์ •๋ ฌ(Unstable Sort) ์ด๋‹ค.
  • ์ •๋ ฌ๋œ ๋ฐฐ์—ด์— ๋Œ€ํ•ด์„œ๋Š” Quick Sort์˜ ๋ถˆ๊ท ํ˜• ๋ถ„ํ• ์— ์˜ํ•ด ์˜คํžˆ๋ ค ์ˆ˜ํ–‰์‹œ๊ฐ„์ด ๋” ๋งŽ์ด ๊ฑธ๋ฆฐ๋‹ค.

๐Ÿ‘‰ ํ€ต์ •๋ ฌ์˜ ์‘์šฉ

  • O(n log n)์˜ ํ‰๊ท  ์‹œ๊ฐ„ ๋ณต์žก๋„๋กœ ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ ์„ธํŠธ๋ฅผ ์ •๋ ฌํ•˜๋Š” ๋ฐ ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค.
  • k๋ฒˆ์งธ๋กœ ์ž‘์€ ์š”์†Œ๋ฅผ ์ฐพ๊ฑฐ๋‚˜ ํ”ผ๋ฒ—์œผ๋กœ ๋ฐฐ์—ด์„ ๋‚˜๋ˆ„๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๋ถ„ํ•  ๋ฌธ์ œ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ๋ฌด์ž‘์œ„ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ํ•„์ˆ˜์ ์ด๋ฉฐ ๊ฒฐ์ •๋ก ์  ์ ‘๊ทผ ๋ฐฉ์‹๋ณด๋‹ค ๋” ๋‚˜์€ ์„ฑ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ์•”ํ˜ธํ™”์— ์ ์šฉ๋˜์–ด ๋‚œ์ˆ˜ ์ˆœ์—ด๊ณผ ์˜ˆ์ธกํ•  ์ˆ˜ ์—†๋Š” ์•”ํ˜ธํ™” ํ‚ค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ๋‹ค์ค‘ ์ฝ”์–ด ๋˜๋Š” ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์˜ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ๋ถ„ํ•  ๋‹จ๊ณ„๋ฅผ ๋ณ‘๋ ฌํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํ‰๊ท ์  ๋ณต์žก์„ฑ์„ ๋ถ„์„ํ•˜๊ณ  ์ƒˆ๋กœ์šด ๊ธฐ์ˆ ์„ ๊ฐœ๋ฐœํ•˜๋Š” ์ด๋ก  ์ปดํ“จํ„ฐ ๊ณผํ•™์—์„œ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

๐ŸฆŠ Merge Sort

๐Ÿ‘‰ Abstract

๋ณ‘ํ•ฉ ์ •๋ ฌ ์€ ๋ถ„ํ•  ์ •๋ณต ์ ‘๊ทผ๋ฒ• ์„ ๋”ฐ๋ฅด๋Š” ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ž…๋‹ˆ๋‹ค . ์ž…๋ ฅ ๋ฐฐ์—ด์„ ๋” ์ž‘์€ ํ•˜์œ„ ๋ฐฐ์—ด๋กœ ์žฌ๊ท€์ ์œผ๋กœ ๋‚˜๋ˆ„๊ณ  ํ•ด๋‹น ํ•˜์œ„ ๋ฐฐ์—ด์„ ์ •๋ ฌํ•œ ๋‹ค์Œ ๋‹ค์‹œ ๋ณ‘ํ•ฉํ•˜์—ฌ ์ •๋ ฌ๋œ ๋ฐฐ์—ด์„ ์–ป์Šต๋‹ˆ๋‹ค.

๊ฐ„๋‹จํžˆ ๋งํ•ด์„œ, ๋ณ‘ํ•ฉ ์ •๋ ฌ ํ”„๋กœ์„ธ์Šค๋Š” ๋ฐฐ์—ด์„ ๋‘ ๊ฐœ์˜ ๋ฐ˜์œผ๋กœ ๋‚˜๋ˆ„๊ณ , ๊ฐ ๋ฐ˜์„ ์ •๋ ฌํ•œ ๋‹ค์Œ, ์ •๋ ฌ๋œ ๋ฐ˜์„ ๋‹ค์‹œ ๋ณ‘ํ•ฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ํ”„๋กœ์„ธ์Šค๋Š” ์ „์ฒด ๋ฐฐ์—ด์ด ์ •๋ ฌ๋  ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต๋ฉ๋‹ˆ๋‹ค.

-> ํ€ต์†ŒํŠธ์™€๋Š” ๋ฐ˜๋Œ€๋กœ ์•ˆ์ • ์ •๋ ฌ์— ์†ํ•จ,
-> ์š”์†Œ๋ฅผ ์ชผ๊ฐ  ํ›„, ๋‹ค์‹œ ํ•ฉ๋ณ‘์‹œํ‚ค๋ฉด์„œ ์ •๋ ฌํ•ด๋‚˜๊ฐ€๋Š” ๋ฐฉ์‹์œผ๋กœ, ์ชผ๊ฐœ๋Š” ๋ฐฉ์‹์€ ํ€ต์ •๋ ฌ๊ณผ ์œ ์‚ฌ

๐Ÿ‘‰ Process

  1. ๋ถ„ํ• : ๋ชฉ๋ก์ด๋‚˜ ๋ฐฐ์—ด์„ ์žฌ๊ท€์ ์œผ๋กœ ๋‘ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆ„์–ด ๋” ์ด์ƒ ๋‚˜๋ˆŒ ์ˆ˜ ์—†์„ ๋•Œ๊นŒ์ง€ ๋ถ„ํ• ํ•ฉ๋‹ˆ๋‹ค.
  2. ์ •๋ณต: ๊ฐ ๋ถ€๋ถ„ ๋ฐฐ์—ด์€ ๋ณ‘ํ•ฉ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ๋ณ„์ ์œผ๋กœ ์ •๋ ฌ๋ฉ๋‹ˆ๋‹ค.
  3. ๋ณ‘ํ•ฉ: ์ •๋ ฌ๋œ ํ•˜์œ„ ๋ฐฐ์—ด์€ ์ •๋ ฌ๋œ ์ˆœ์„œ๋Œ€๋กœ ๋‹ค์‹œ ๋ณ‘ํ•ฉ๋ฉ๋‹ˆ๋‹ค. ์ด ํ”„๋กœ์„ธ์Šค๋Š” ๋‘ ํ•˜์œ„ ๋ฐฐ์—ด์˜ ๋ชจ๋“  ์š”์†Œ๊ฐ€ ๋ณ‘ํ•ฉ๋  ๋•Œ๊นŒ์ง€ ๊ณ„์†๋ฉ๋‹ˆ๋‹ค.

๐Ÿ‘‰ ํ€ต์ •๋ ฌ๊ณผ์˜ ์ฐจ์ด์ 

  • ํ€ต์ •๋ ฌ : ์šฐ์„  ํ”ผ๋ฒ—์„ ํ†ตํ•ด ์ •๋ ฌ(partition) โ†’ ์˜์—ญ์„ ์ชผ๊ฐฌ(quickSort)

  • ํ•ฉ๋ณ‘์ •๋ ฌ : ์˜์—ญ์„ ์ชผ๊ฐค ์ˆ˜ ์žˆ์„ ๋งŒํผ ์ชผ๊ฐฌ(mergeSort) โ†’ ์ •๋ ฌ(merge)

์ด๋ฏธ ํ•ฉ๋ณ‘์˜ ๋Œ€์ƒ์ด ๋˜๋Š” ๋‘ ์˜์—ญ์ด ๊ฐ ์˜์—ญ์— ๋Œ€ํ•ด์„œ ์ •๋ ฌ์ด ๋˜์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‹จ์ˆœํžˆ ๋‘ ๋ฐฐ์—ด์„ ์ˆœ์ฐจ์ ์œผ๋กœ ๋น„๊ตํ•˜๋ฉด์„œ ์ •๋ ฌํ•  ์ˆ˜๊ฐ€ ์žˆ๋‹ค.

โ˜…โ˜…โ˜…ํ•ฉ๋ณ‘์ •๋ ฌ์€ ์ˆœ์ฐจ์ ์ธ ๋น„๊ต๋กœ ์ •๋ ฌ์„ ์ง„ํ–‰ํ•˜๋ฏ€๋กœ, LinkedList์˜ ์ •๋ ฌ์ด ํ•„์š”ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋ฉด ํšจ์œจ์ ์ด๋‹ค.โ˜…โ˜…โ˜…

Q. LinkedList๋ฅผ ํ€ต์ •๋ ฌ์„ ์‚ฌ์šฉํ•ด ์ •๋ ฌํ•˜๋ฉด?

์„ฑ๋Šฅ์ด ์ข‹์ง€ ์•Š์Œ
ํ€ต์ •๋ ฌ์€, ์ˆœ์ฐจ ์ ‘๊ทผ์ด ์•„๋‹Œ ์ž„์˜ ์ ‘๊ทผ์ด๊ธฐ ๋•Œ๋ฌธ

LinkedList๋Š” ์‚ฝ์ž…, ์‚ญ์ œ ์—ฐ์‚ฐ์—์„œ ์œ ์šฉํ•˜์ง€๋งŒ ์ ‘๊ทผ ์—ฐ์‚ฐ์—์„œ๋Š” ๋น„ํšจ์œจ์ ์ž„
๋”ฐ๋ผ์„œ ์ž„์˜๋กœ ์ ‘๊ทผํ•˜๋Š” ํ€ต์†ŒํŠธ๋ฅผ ํ™œ์šฉํ•˜๋ฉด ์˜ค๋ฒ„ํ—ค๋“œ ๋ฐœ์ƒ์ด ์ฆ๊ฐ€ํ•˜๊ฒŒ ๋จ

๋ฐฐ์—ด์€ ์ธ๋ฑ์Šค๋ฅผ ์ด์šฉํ•ด์„œ ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, LinkedList๋Š” Head๋ถ€ํ„ฐ ํƒ์ƒ‰ํ•ด์•ผ ํ•จ
๋ฐฐ์—ด[O(1)] vs LinkedList[O(n)]

๐Ÿ‘‰ Code

1.

def merge(arr, left, mid, right):
    n1 = mid - left + 1
    n2 = right - mid

    # Create temp arrays
    L = [0] * n1
    R = [0] * n2

    # Copy data to temp arrays L[] and R[]
    for i in range(n1):
        L[i] = arr[left + i]
    for j in range(n2):
        R[j] = arr[mid + 1 + j]

    i = 0  # Initial index of first subarray
    j = 0  # Initial index of second subarray
    k = left  # Initial index of merged subarray

    # Merge the temp arrays back
    # into arr[left..right]
    while i < n1 and j < n2:
        if L[i] <= R[j]:
            arr[k] = L[i]
            i += 1
        else:
            arr[k] = R[j]
            j += 1
        k += 1

    # Copy the remaining elements of L[],
    # if there are any
    while i < n1:
        arr[k] = L[i]
        i += 1
        k += 1

    # Copy the remaining elements of R[], 
    # if there are any
    while j < n2:
        arr[k] = R[j]
        j += 1
        k += 1

def merge_sort(arr, left, right):
    if left < right:
        mid = (left + right) // 2

        merge_sort(arr, left, mid)
        merge_sort(arr, mid + 1, right)
        merge(arr, left, mid, right)

def print_list(arr):
    for i in arr:
        print(i, end=" ")
    print()

# Driver code
if __name__ == "__main__":
    arr = [12, 11, 13, 5, 6, 7]
    print("Given array is")
    print_list(arr)

    merge_sort(arr, 0, len(arr) - 1)

    print("\nSorted array is")
    print_list(arr)

2.

def merge_sort(arr):
    if len(arr) <= 1:
        return arr  # ๋ฆฌ์ŠคํŠธ ํฌ๊ธฐ๊ฐ€ 1 ์ดํ•˜์ด๋ฉด ์ •๋ ฌ ์™„๋ฃŒ

    mid = len(arr) // 2
    left = merge_sort(arr[:mid])  # ์™ผ์ชฝ ๋ฐ˜ ์ •๋ ฌ
    right = merge_sort(arr[mid:])  # ์˜ค๋ฅธ์ชฝ ๋ฐ˜ ์ •๋ ฌ
    
    return merge(left, right)  # ์ •๋ ฌ๋œ ๋‘ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ณ‘ํ•ฉ

def merge(left, right):
    sorted_arr = []
    i = j = 0

    while i < len(left) and j < len(right):  # ๋‘ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋น„๊ตํ•˜๋ฉฐ ์ •๋ ฌ
        if left[i] < right[j]:
            sorted_arr.append(left[i])
            i += 1
        else:
            sorted_arr.append(right[j])
            j += 1

    sorted_arr.extend(left[i:])  # ๋‚จ์€ ์›์†Œ ์ถ”๊ฐ€
    sorted_arr.extend(right[j:])  # ๋‚จ์€ ์›์†Œ ์ถ”๊ฐ€
    return sorted_arr

# ํ…Œ์ŠคํŠธ
arr = [3, 6, 8, 10, 1, 2, 1]
print(merge_sort(arr))  # [1, 1, 2, 3, 6, 8, 10]

๐Ÿ‘‰ ์‹œ๊ฐ„ ๋ณต์žก๋„

  • ์ตœ์ƒ์˜ ๊ฒฝ์šฐ: O(n log n), ๋ฐฐ์—ด์ด ์ด๋ฏธ ์ •๋ ฌ๋˜์–ด ์žˆ๊ฑฐ๋‚˜ ๊ฑฐ์˜ ์ •๋ ฌ๋˜์–ด ์žˆ๋Š” ๊ฒฝ์šฐ.
  • ํ‰๊ท ์  ์‚ฌ๋ก€: O(n log n), ๋ฐฐ์—ด์ด ๋ฌด์ž‘์œ„๋กœ ์ •๋ ฌ๋œ ๊ฒฝ์šฐ.
  • ์ตœ์•…์˜ ๊ฒฝ์šฐ: O(n log n), ๋ฐฐ์—ด์ด ์—ญ์ˆœ์œผ๋กœ ์ •๋ ฌ๋œ ๊ฒฝ์šฐ.

๐Ÿ‘‰ ๋ณด์กฐ ๊ณต๊ฐ„

O(n), ๋ณ‘ํ•ฉ ์ค‘์— ์‚ฌ์šฉ๋˜๋Š” ์ž„์‹œ ๋ฐฐ์—ด์„ ์œ„ํ•œ ์ถ”๊ฐ€ ๊ณต๊ฐ„์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ‘‰ ๋ณ‘ํ•ฉ์ •๋ ฌ ์‘์šฉ

  • ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ ์„ธํŠธ ์ •๋ ฌ
  • ์™ธ๋ถ€ ์ •๋ ฌ (๋ฐ์ดํ„ฐ ์„ธํŠธ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ๋งž์„ ๋งŒํผ ํฐ ๊ฒฝ์šฐ)
  • ์—ญ ๊ณ„์‚ฐ
  • ๋ณ‘ํ•ฉ ์ •๋ ฌ๊ณผ ๊ทธ ๋ณ€ํ˜•์€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฉ”์„œ๋“œ์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
    -> TimSort ์˜ ๋ณ€ํ˜•์€ Python, Java Android ๋ฐ Swift์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋น„์›์‹œ ์œ ํ˜•์„ ์ •๋ ฌํ•˜๋Š” ๊ฒƒ์ด ์„ ํ˜ธ๋˜๋Š” ์ฃผ๋œ ์ด์œ ๋Š” QuickSort์—๋Š” ์—†๋Š” ์•ˆ์ •์„ฑ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
  • ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ •๋ ฌํ•˜๋Š” ๋ฐ ์„ ํ˜ธ๋˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ž…๋‹ˆ๋‹ค.
  • ๋…๋ฆฝ์ ์œผ๋กœ ๋ถ€๋ถ„ ๋ฐฐ์—ด์„ ์ •๋ ฌํ•œ ๋‹ค์Œ ๋ณ‘ํ•ฉํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์‰ฝ๊ฒŒ ๋ณ‘๋ ฌํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ณ‘ํ•ฉ ์ •๋ ฌ์˜ ๋ณ‘ํ•ฉ ๊ธฐ๋Šฅ์€ ๋‘ ๊ฐœ์˜ ์ •๋ ฌ๋œ ๋ฐฐ์—ด์˜ ํ•ฉ์ง‘ํ•ฉ, ๊ต์ง‘ํ•ฉ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค .

๐Ÿ‘‰ ๋ณ‘ํ•ฉ ์ •๋ ฌ์˜ ์žฅ์ ๊ณผ ๋‹จ์ 

์žฅ์ 

  • ์•ˆ์ •์„ฑ : ๋ณ‘ํ•ฉ ์ •๋ ฌ์€ ์•ˆ์ •์ ์ธ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ, ์ž…๋ ฅ ๋ฐฐ์—ด์—์„œ ๋™์ผํ•œ ์š”์†Œ์˜ ์ƒ๋Œ€์  ์ˆœ์„œ๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.
  • ์ตœ์•…์˜ ์„ฑ๋Šฅ ๋ณด์žฅ: ๋ณ‘ํ•ฉ ์ •๋ ฌ์€ ์ตœ์•…์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ O(N logN) ์ด๋ฏ€๋กœ ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ ์„ธํŠธ์—์„œ๋„ ์ข‹์€ ์„ฑ๋Šฅ์„ ๋ณด์ž…๋‹ˆ๋‹ค.
  • ๊ตฌํ˜„์ด ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ๋ถ„ํ•  ์ •๋ณต ๋ฐฉ์‹์€ ์ง๊ด€์ ์ž…๋‹ˆ๋‹ค.
  • ์ž์—ฐ์Šค๋Ÿฌ์šด ๋ณ‘๋ ฌ : ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ์— ์ ํ•ฉํ•˜๋„๋ก ํ•˜์œ„ ๋ฐฐ์—ด์„ ๋…๋ฆฝ์ ์œผ๋กœ ๋ณ‘ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

๋‹จ์ 

  • ๊ณต๊ฐ„ ๋ณต์žก๋„: ๋ณ‘ํ•ฉ ์ •๋ ฌ์€ ์ •๋ ฌ ๊ณผ์ •์—์„œ ๋ณ‘ํ•ฉ๋œ ํ•˜์œ„ ๋ฐฐ์—ด์„ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ์ถ”๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • ์ œ์ž๋ฆฌ ์ •๋ ฌ์ด ์•„๋‹˜: ๋ณ‘ํ•ฉ ์ •๋ ฌ์€ ์ œ์ž๋ฆฌ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์•„๋‹ˆ๋ฏ€๋กœ ์ •๋ ฌ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด ์ถ”๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋‹จ์ ์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ณ‘ํ•ฉ ์ •๋ ฌ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ํ€ต ์ •๋ ฌ๋ณด๋‹ค ๋А๋ฆฝ๋‹ˆ๋‹ค. ํ€ต ์ •๋ ฌ์€ ์ œ์ž๋ฆฌ์—์„œ ์ž‘๋™ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์บ์‹œ์— ๋” ์นœํ™”์ ์ž…๋‹ˆ๋‹ค.

๐ŸฆŠ Heap Sort

๐Ÿ‘‰ Abstract

ํž™ ์ •๋ ฌ ์€ ์ด์ง„ ํž™ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ ์— ๊ธฐ๋ฐ˜ํ•œ ํž™(Heap) ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœํ•œ ๋น„๊ต ๊ธฐ๋ฐ˜ ์ •๋ ฌ ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค.

์„ ํƒ ์ •๋ ฌ ์— ๋Œ€ํ•œ ์ตœ์ ํ™”๋กœ ๋ณผ ์ˆ˜ ์žˆ๋Š”๋ฐ , ๋จผ์ € ์ตœ๋Œ€(๋˜๋Š” ์ตœ์†Œ) ์š”์†Œ๋ฅผ ์ฐพ์•„์„œ ๋งˆ์ง€๋ง‰(๋˜๋Š” ์ฒซ ๋ฒˆ์งธ) ์š”์†Œ์™€ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค. ๋‚˜๋จธ์ง€ ์š”์†Œ์— ๋Œ€ํ•ด์„œ๋„ ๊ฐ™์€ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค.
ํž™ ์ •๋ ฌ์—์„œ๋Š” ์ด์ง„ ํž™์„ ์‚ฌ์šฉํ•˜์—ฌ O(n) ๋Œ€์‹  O(Log n)์—์„œ ์ตœ๋Œ€ ์š”์†Œ๋ฅผ ๋น ๋ฅด๊ฒŒ ์ฐพ์•„ ์ด๋™ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ O(n Log n) ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๋‹ฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

Q. ์™„์ „ ์ด์ง„ ํŠธ๋ฆฌ๋ž€?

์‚ฝ์ž…ํ•  ๋•Œ ์™ผ์ชฝ๋ถ€ํ„ฐ ์ฐจ๋ก€๋Œ€๋กœ ์ถ”๊ฐ€ํ•˜๋Š” ์ด์ง„ ํŠธ๋ฆฌ

๐Ÿ‘‰ Process

1๋‹จ๊ณ„: ๋ฐฐ์—ด์„ ์™„์ „ํ•œ ์ด์ง„ ํŠธ๋ฆฌ๋กœ ์ทจ๊ธ‰

2๋‹จ๊ณ„: ์ตœ๋Œ€ ํž™ ๊ตฌ์ถ•
3๋‹จ๊ณ„: ์ •๋ ฌ๋˜์ง€ ์•Š์€ ๋ฐฐ์—ด์˜ ๋์— ๊ฐ€์žฅ ํฐ ์š”์†Œ๋ฅผ ๋ฐฐ์น˜ํ•˜์—ฌ ๋ฐฐ์—ด์„ ์ •๋ ฌํ•ฉ๋‹ˆ๋‹ค.
ํž™์— ํ•˜๋‚˜์˜ ์š”์†Œ๋งŒ ๋‚จ์„ ๋•Œ๊นŒ์ง€ ์ด๋Ÿฌํ•œ ๋‹จ๊ณ„๋ฅผ ๊ณ„์† ๋ฐ˜๋ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  1. ์ตœ๋Œ€ ํž™์„ ๊ตฌ์„ฑ
  2. ํ˜„์žฌ ํž™ ๋ฃจํŠธ๋Š” ๊ฐ€์žฅ ํฐ ๊ฐ’์ด ์กด์žฌํ•จ. ๋ฃจํŠธ์˜ ๊ฐ’์„ ๋งˆ์ง€๋ง‰ ์š”์†Œ์™€ ๋ฐ”๊พผ ํ›„, ํž™์˜ ์‚ฌ์ด์ฆˆ ํ•˜๋‚˜ ์ค„์ž„
  3. ํž™์˜ ์‚ฌ์ด์ฆˆ๊ฐ€ 1๋ณด๋‹ค ํฌ๋ฉด ์œ„ ๊ณผ์ • ๋ฐ˜๋ณต


    ์ด์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ตœ๋Œ€ ๊ฐ’์„ ํ•˜๋‚˜์”ฉ ๋ฝ‘์•„๋‚ด๋ฉด์„œ ์ •๋ ฌํ•˜๋Š” ๊ฒƒ์ด ํž™ ์†ŒํŠธ

๐Ÿ‘‰ Code

1.

# Python program for implementation of heap Sort

# To heapify a subtree rooted with node i
# which is an index in arr[].
def heapify(arr, n, i):
    
     # Initialize largest as root
    largest = i 
    
    #  left index = 2*i + 1
    l = 2 * i + 1 
    
    # right index = 2*i + 2
    r = 2 * i + 2  

    # If left child is larger than root
    if l < n and arr[l] > arr[largest]:
        largest = l

    # If right child is larger than largest so far
    if r < n and arr[r] > arr[largest]:
        largest = r

    # If largest is not root
    if largest != i:
        arr[i], arr[largest] = arr[largest], arr[i]  # Swap

        # Recursively heapify the affected sub-tree
        heapify(arr, n, largest)

# Main function to do heap sort
def heapSort(arr):
    
    n = len(arr) 

    # Build heap (rearrange array)
    for i in range(n // 2 - 1, -1, -1):
        heapify(arr, n, i)

    # One by one extract an element from heap
    for i in range(n - 1, 0, -1):
      
        # Move root to end
        arr[0], arr[i] = arr[i], arr[0] 

        # Call max heapify on the reduced heap
        heapify(arr, i, 0)

def printArray(arr):
    for i in arr:
        print(i, end=" ")
    print()

# Driver's code
arr = [9, 4, 3, 8, 10, 2, 5] 
heapSort(arr)
print("Sorted array is ")
printArray(arr)

2. Python์˜ heapq ๋ชจ๋“ˆ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ตœ์†Œ ํž™(Min Heap)์„ ์ œ๊ณต

def heap_sort(arr):
    import heapq
    heapq.heapify(arr)  # ๋ฆฌ์ŠคํŠธ๋ฅผ ์ตœ์†Œ ํž™์œผ๋กœ ๋ณ€ํ™˜
    return [heapq.heappop(arr) for _ in range(len(arr))]  # ํž™์—์„œ ํ•˜๋‚˜์”ฉ ๊บผ๋‚ด ์ •๋ ฌ

# ํ…Œ์ŠคํŠธ
arr = [3, 6, 8, 10, 1, 2, 1]
print(heap_sort(arr))  # [1, 1, 2, 3, 6, 8, 10]

3.์ตœ๋Œ€ ํž™(Max Heap)์„ ์ง์ ‘ ๊ตฌํ˜„ํ•˜์—ฌ ํž™ ์ •๋ ฌ์„ ์ˆ˜ํ–‰ ๊ฐ€๋Šฅ

def heapify(arr, n, i):
    largest = i  # ๋ฃจํŠธ ๋…ธ๋“œ
    left = 2 * i + 1  # ์™ผ์ชฝ ์ž์‹ ๋…ธ๋“œ
    right = 2 * i + 2  # ์˜ค๋ฅธ์ชฝ ์ž์‹ ๋…ธ๋“œ

    # ์™ผ์ชฝ ์ž์‹์ด ๋ฃจํŠธ๋ณด๋‹ค ํฌ๋‹ค๋ฉด
    if left < n and arr[left] > arr[largest]:
        largest = left

    # ์˜ค๋ฅธ์ชฝ ์ž์‹์ด ํ˜„์žฌ ์ตœ๋Œ€๊ฐ’๋ณด๋‹ค ํฌ๋‹ค๋ฉด
    if right < n and arr[right] > arr[largest]:
        largest = right

    # ์ตœ๋Œ€๊ฐ’์ด ๋ฃจํŠธ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ์Šค์™‘ ํ›„ ๋‹ค์‹œ ํž™ ์†์„ฑ์„ ์œ ์ง€ํ•˜๋„๋ก ํ˜ธ์ถœ
    if largest != i:
        arr[i], arr[largest] = arr[largest], arr[i]
        heapify(arr, n, largest)  # ์žฌ๊ท€ ํ˜ธ์ถœ

def heap_sort(arr):
    n = len(arr)

    # 1. ์ตœ๋Œ€ ํž™(Max Heap) ๋งŒ๋“ค๊ธฐ (Heapify ๊ณผ์ •)
    for i in range(n // 2 - 1, -1, -1):  # ๋‚ด๋ถ€ ๋…ธ๋“œ๋ถ€ํ„ฐ ํž™ ์†์„ฑ์„ ๋งŒ์กฑํ•˜๋„๋ก ๋ณ€ํ™˜
        heapify(arr, n, i)

    # 2. ์ •๋ ฌ ๊ณผ์ • (Heap Sort)
    for i in range(n - 1, 0, -1):
        arr[i], arr[0] = arr[0], arr[i]  # ์ตœ๋Œ€๊ฐ’(๋ฃจํŠธ)์™€ ๋งˆ์ง€๋ง‰ ์š”์†Œ๋ฅผ ๊ตํ™˜
        heapify(arr, i, 0)  # ๋ฃจํŠธ์— ๋Œ€ํ•ด ๋‹ค์‹œ Heapify ์ˆ˜ํ–‰

    return arr

# ํ…Œ์ŠคํŠธ
arr = [3, 6, 8, 10, 1, 2, 1]
print(heap_sort(arr))  # [1, 1, 2, 3, 6, 8, 10]

๐Ÿ‘‰ ํž™ ์†ŒํŠธ๊ฐ€ ์œ ์šฉํ•  ๋•Œ

  • ๊ฐ€์žฅ ํฌ๊ฑฐ๋‚˜ ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์„ ๊ตฌํ•  ๋•Œ

-> ์ตœ์†Œ ํž™ or ์ตœ๋Œ€ ํž™์˜ ๋ฃจํŠธ ๊ฐ’์ด๊ธฐ ๋•Œ๋ฌธ์— ํ•œ๋ฒˆ์˜ ํž™ ๊ตฌ์„ฑ์„ ํ†ตํ•ด ๊ตฌํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅ

  • ์ตœ๋Œ€ k ๋งŒํผ ๋–จ์–ด์ง„ ์š”์†Œ๋“ค์„ ์ •๋ ฌํ•  ๋•Œ

-> ์‚ฝ์ž…์ •๋ ฌ๋ณด๋‹ค ๋”์šฑ ๊ฐœ์„ ๋œ ๊ฒฐ๊ณผ๋ฅผ ์–ป์–ด๋‚ผ ์ˆ˜ ์žˆ์Œ

๐Ÿ‘‰ ํž™ ์ •๋ ฌ ์˜ ๋ณต์žก๋„

  • ์‹œ๊ฐ„ ๋ณต์žก๋„: O(n log n)
  • ๋ณด์กฐ ๊ณต๊ฐ„: ์žฌ๊ท€์  ํ˜ธ์ถœ ์Šคํƒ์œผ๋กœ ์ธํ•ด O(log n). ๊ทธ๋Ÿฌ๋‚˜ ๋ณด์กฐ ๊ณต๊ฐ„์€ ๋ฐ˜๋ณต ๊ตฌํ˜„์˜ ๊ฒฝ์šฐ O(1)์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ‘‰ Heap Sort์— ๋Œ€ํ•œ ์ค‘์š”ํ•œ ์ 

  • ํž™ ์ •๋ ฌ์€ ์ œ์ž๋ฆฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ž…๋‹ˆ๋‹ค.
  • ์ผ๋ฐ˜์ ์ธ ๊ตฌํ˜„์€ ์•ˆ์ •์ ์ด์ง€ ์•Š์ง€๋งŒ ์•ˆ์ •์ ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค
  • ์ผ๋ฐ˜์ ์œผ๋กœ ์ž˜ ๊ตฌํ˜„๋œ QuickSort ๋ณด๋‹ค 2-3๋ฐฐ ๋А๋ฆฝ๋‹ˆ๋‹ค . ๋А๋ฆฐ ์ด์œ ๋Š” ์ฐธ์กฐ ์ง€์—ญ์„ฑ์ด ๋ถ€์กฑํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๐Ÿ‘‰ ํž™ ์ •๋ ฌ์˜ ์žฅ๋‹จ์ 

ํž™ ์ •๋ ฌ์˜ ์žฅ์ 

  • ํšจ์œจ์ ์ธ ์‹œ๊ฐ„ ๋ณต์žก๋„: ํž™ ์ •๋ ฌ์€ ๋ชจ๋“  ๊ฒฝ์šฐ์— O(n log n)์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ–์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ ์„ธํŠธ๋ฅผ ์ •๋ ฌํ•˜๋Š” ๋ฐ ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค. log n ์š”์†Œ๋Š” ์ด์ง„ ํž™์˜ ๋†’์ด์—์„œ ๋‚˜์˜ค๋ฉฐ, ์ด๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๋งŽ์€ ์ˆ˜์˜ ์š”์†Œ์—์„œ๋„ ์ข‹์€ ์„ฑ๋Šฅ์„ ์œ ์ง€ํ•˜๋„๋ก ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ: ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ์€ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์žฌ๊ท€์  heapify() ๋Œ€์‹  ๋ฐ˜๋ณต์  heapify()๋ฅผ ์ž‘์„ฑํ•˜์—ฌ). ๋”ฐ๋ผ์„œ ์ •๋ ฌํ•  ํ•ญ๋ชฉ์˜ ์ดˆ๊ธฐ ๋ชฉ๋ก์„ ๋ณด๊ด€ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๊ฒƒ ์™ธ์—๋Š” ์ž‘๋™ํ•˜๊ธฐ ์œ„ํ•ด ์ถ”๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋‹จ์ˆœ์„ฑ: ์žฌ๊ท€์™€ ๊ฐ™์€ ๊ณ ๊ธ‰ ์ปดํ“จํ„ฐ ๊ณผํ•™ ๊ฐœ๋…์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ๋™๋“ฑํ•œ ํšจ์œจ์„ฑ์˜ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜๋ณด๋‹ค ์ดํ•ดํ•˜๊ธฐ๊ฐ€ ๋” ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค.

ํž™ ์ •๋ ฌ์˜ ๋‹จ์ 

  • ๋น„์šฉ : ํž™ ์ •๋ ฌ์€ ๋ณ‘ํ•ฉ ์ •๋ ฌ๋ณด๋‹ค ์ƒ์ˆ˜๊ฐ€ ๋” ๋†’๊ธฐ ๋•Œ๋ฌธ์— ๋น„์šฉ์ด ๋งŽ์ด ๋“ญ๋‹ˆ๋‹ค. ๋‘ ์ •๋ ฌ ๋ชจ๋‘ ์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ O(n Log n)์ž…๋‹ˆ๋‹ค.
  • ๋ถˆ์•ˆ์ • : ํž™ ์ •๋ ฌ์€ ๋ถˆ์•ˆ์ •ํ•ฉ๋‹ˆ๋‹ค. ์ƒ๋Œ€์  ์ˆœ์„œ๋ฅผ ์žฌ์ •๋ ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋น„ํšจ์œจ์„ฑ: ํž™ ์ •๋ ฌ์€ ์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ ๋†’๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋‹ค์ง€ ํšจ์œจ์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ •๋ฆฌ

  • ๋น ๋ฅธ ์ •๋ ฌ์ด ํ•„์š”ํ•˜๋ฉด? โ†’ ํ€ต ์ •๋ ฌ
  • ์•ˆ์ • ์ •๋ ฌ์ด ํ•„์š”ํ•˜๋ฉด? โ†’ ๋ณ‘ํ•ฉ ์ •๋ ฌ
  • ์ œ์ž๋ฆฌ ์ •๋ ฌ์ด ํ•„์š”ํ•˜๋ฉด? โ†’ ํž™ ์ •๋ ฌ

์ •๋ ฌ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ‰๊ท  ์‹œ๊ฐ„ ๋ณต์žก๋„ ์ตœ์•… ์‹œ๊ฐ„ ๋ณต์žก๋„ ๊ณต๊ฐ„ ๋ณต์žก๋„ ํŠน์ง•
ํ€ต ์ •๋ ฌ (Quick Sort) O(n log n) O(nยฒ) (์ตœ์•…: ์ด๋ฏธ ์ •๋ ฌ๋œ ๊ฒฝ์šฐ) O(n) (๋น„ํšจ์œจ์  ๊ตฌํ˜„) ๋ถ„ํ•  ์ •๋ณต, ๋น ๋ฆ„
๋ณ‘ํ•ฉ ์ •๋ ฌ (Merge Sort) O(n log n) O(n log n) O(n) ์•ˆ์ • ์ •๋ ฌ, ์ผ๊ด€๋œ ์„ฑ๋Šฅ
ํž™ ์ •๋ ฌ (Heap Sort) O(n log n) O(n log n) O(1) ์ œ์ž๋ฆฌ ์ •๋ ฌ ๊ฐ€๋Šฅ

profile
๐Ÿ‡ฌ๐Ÿ‡ง์˜๊ตญ๋Œ€ํ•™๊ต)Computer Scienceํ•™๊ณผ ์กธ์—… ๐Ÿ“šData, AI, Backend ๋ถ„์•ผ์— ๊ด€์‹ฌ์ด ๋งŽ์Šต๋‹ˆ๋‹ค. ๐Ÿ‘‰Email: kimbg9876@gmail.com

0๊ฐœ์˜ ๋Œ“๊ธ€