Skip to content

Latest commit

ย 

History

History
80 lines (62 loc) ยท 2.9 KB

Heap_Sort.md

File metadata and controls

80 lines (62 loc) ยท 2.9 KB

ํž™ ์ •๋ ฌ

์™„์ „ ์ด์ง„ ํŠธ๋ฆฌ๋ฅผ ๊ธฐ๋ณธ์œผ๋กœ ํ•˜๋Š” ํž™(Heap) ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœํ•œ ์ •๋ ฌ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.
์ตœ๋Œ€ ํž™ ํŠธ๋ฆฌ๋‚˜ ์ตœ์†Œ ํž™ ํŠธ๋ฆฌ๋ฅผ ๊ตฌ์„ฑํ•ด์„œ ์ •๋ ฌ์„ ํ•ฉ๋‹ˆ๋‹ค.

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

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

์ •๋ ฌ ๊ณผ์ •

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

GIF๋กœ ์ดํ•ดํ•˜๊ธฐ

heapsort2

ํŠน์ง•

  • ๊ณต๊ฐ„ ๋ณต์žก๋„
    • ์ฃผ์–ด์ง„ ๋ฐฐ์—ด ์•ˆ์—์„œ ๊ตํ™˜(swap)์„ ํ†ตํ•ด, ์ •๋ ฌ์ด ์ˆ˜ํ–‰๋˜๋ฏ€๋กœ O(n)์ž…๋‹ˆ๋‹ค.
  • ์‹œ๊ฐ„ ๋ณต์žก๋„
    • ํž™ ๊ตฌ์กฐ ์ƒ์„ฑ์‹œ ์—ฐ์‚ฐ ์ˆ˜๋Š” ํž™์˜ ๋†’์ด์™€ ๋™์ผํ•˜๋ฏ€๋กœ O(logN)์ด ๋ฉ๋‹ˆ๋‹ค.
    • ๋”ฐ๋ผ์„œ ํž™ ์ •๋ ฌ์˜ ์ „์ฒด ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” ํž™ ์ƒ์„ฑ(Heapify)์•Œ๊ณ ๋ฆฌ์ฆ˜ ์‹œ๊ฐ„ ๋ณต์žก๋„ O(logN) * ์ „์ฒด ๋ฐ์ดํ„ฐ ์ˆ˜ N = O(NlogN) ์ž…๋‹ˆ๋‹ค.

์žฅ์ 

  • ์ตœ์•…์˜ ์ƒํ™ฉ์—๋„ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ O(NlogN)์ด๋ผ ์„ฑ๋Šฅ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
  • ๊ฐ€์žฅ ํฐ ๊ฐ’์ด๋‚˜ ๊ฐ€์žฅ ์ž‘์€ ๊ฐ’์„ ๊ตฌํ•  ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋‹จ์ 

  • ์ผ๋ฐ˜์ ์œผ๋กœ ์†๋„๋งŒ ๋น„๊ตํ•˜๋ฉด ํ€ต ์ •๋ ฌ์ด ํ‰๊ท ์ ์œผ๋กœ ๋” ๋น ๋ฆ…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ž์ฃผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๐Ÿ“Œ ์˜ˆ์ œ (Baekjoon)

๋ฐฑ์ค€ - ์ˆ˜ ์ •๋ ฌํ•˜๊ธฐ

๋ฌธ์ œ

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2023-01-18 แ„‹แ…ฉแ„’แ…ฎ 6 01 12

ํ’€์ด

์ž…๋ ฅ ๊ฐ’๋“ค์„ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•˜๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.
์ตœ๋Œ€ ํž™์„ ์ด์šฉํ•˜์—ฌ HeapSort๋กœ ์ •๋ ฌํ•ฉ๋‹ˆ๋‹ค.

์ฝ”๋“œ(Python)

def heap_sort(arr):
    n = len(arr)
    for i in range(n//2 - 1, -1, -1):       # ์ตœ๋Œ€ ํž™ ์ดˆ๊ธฐํ™”
        heapify(arr, n, i)
    for i in range(n-1, 0, -1):     # extract ์—ฐ์‚ฐ
        swap(arr, 0, i)
        heapify(arr, i, 0)

def heapify(arr, n, i):
    p = i
    l = i * 2 + 1
    r = i * 2 + 2

    if l < n and arr[p] < arr[l]:   # ์™ผ์ชฝ ์ž์‹๋…ธ๋“œ
        p = l
    if r < n and arr[p] < arr[r]:   # ์˜ค๋ฅธ์ชฝ ์ž์‹๋…ธ๋“œ
        p = r 
    if i != p:                      # ๋ถ€๋ชจ๋…ธ๋“œ < ์ž์‹๋…ธ๋“œ
        swap(arr, p, i)
        heapify(arr, n, p)

def swap(arr, a, b):    # ์š”์†Œ ๊ตํ™˜
    arr[a], arr[b] = arr[b], arr[a]

n = int(input())
numbers = []

for _ in range(n):
    numbers.append(int(input()))

heap_sort(numbers)

for n in numbers:
    print(n)

Reference

์ž๋ฃŒ๊ตฌ์กฐ - ํž™(Heap)
https://www.codesdope.com/course/algorithms-heapsort/