πŸ§ͺ 컴퓨터과학 : CS

[Algorithm] νž™ μ •λ ¬ (Heap Sort)

개발자 HOON 2022. 9. 3. 14:51

νž™ μ •λ ¬ (Heap Sort)

νž™ 정렬은 μ‹œκ°„ λ³΅μž‘λ„κ°€ O(NlogN)인 μ •λ ¬μœΌλ‘œ, 버블 / 선택 / μ‚½μž… 정렬에 λΉ„ν•΄ μš°μˆ˜ν•œ μ„±λŠ₯을 κ°€μ§€κ³  μžˆλ‹€.

 

μš°μ„  νž™ 정렬을 μ‚΄νŽ΄λ³΄μž.

νž™μ€ 자료ꡬ쑰 쀑 ν•˜λ‚˜λ‘œ, 이 'Heap' 자료ꡬ쑰의 νŠΉμ„±μ„ ν™œμš©ν•œ μ •λ ¬ 방법이닀.

νž™μ€ μ™„μ „ μ΄μ§„νŠΈλ¦¬μ˜ μΌμ’…μœΌλ‘œ, μ—¬λŸ¬ κ°’λ“€ μ€‘μ—μ„œ μ΅œμ†Ÿκ°’ ν˜Ήμ€ μ΅œλŒ“κ°’μ„ λΉ λ₯΄κ²Œ μ°ΎκΈ° μœ„ν•΄ μ„€κ³„λœ μžλ£Œκ΅¬μ‘°μ΄λ‹€.

νž™μ€ λŠμŠ¨ν•œ μ •λ ¬ μƒνƒœ(반 μ •λ ¬ μƒνƒœ)λ₯Ό μœ μ§€ν•˜κ³ , 이λ₯Ό μ‰½κ²Œ ν’€μ΄ν•˜λ©΄ λΆ€λͺ¨ λ…Έλ“œμ˜ ν‚€ κ°’이 μžμ‹ λ…Έλ“œμ˜ ν‚€ κ°’보닀 ν•­μƒ ν°(μž‘μ€) μ΄μ§„ νŠΈλ¦¬λ₯Ό λ§ν•œλ‹€.

λΆ€λͺ¨ λ…Έλ“œμ˜ ν‚€ 값이 μžμ‹ λ…Έλ“œμ˜ ν‚€ 값보닀 큰 μ§€, μž‘μ€ 지에 따라 νž™μ˜ μ’…λ₯˜κ°€ λ‚˜λ‰œλ‹€.

- μ΅œλŒ€ νž™ (Max Heap) : λΆ€λͺ¨ λ…Έλ“œμ˜ ν‚€ 값이 μžμ‹ λ…Έλ“œμ˜ ν‚€ 값보닀 큰 νž™ → 루트 λ…Έλ“œμ— κ°€μž₯ 큰 μ›μ†Œκ°€ μœ„μΉ˜ν•˜κ²Œ λœλ‹€.

- μ΅œμ†Œ νž™ (Min Heap) : λΆ€λͺ¨ λ…Έλ“œμ˜ ν‚€ 값이 μžμ‹ λ…Έλ“œμ˜ ν‚€ 값보닀 μž‘μ€ νž™ → 루트 λ…Έλ“œμ— κ°€μž₯ μž‘μ€ μ›μ†Œκ°€ μœ„μΉ˜ν•˜κ²Œ λœλ‹€.

 

 

νž™ μ •λ ¬μ˜ μ•Œκ³ λ¦¬μ¦˜μ„ λ‹¨μˆœν•˜κ²Œ λ‚˜νƒ€λ‚΄λ©΄ λ‹€μŒκ³Ό κ°™λ‹€.

1. μ •λ ¬ν•˜κ³ μž ν•˜λŠ” 배열을 νž™μœΌλ‘œ λ§Œλ“ λ‹€. (이 과정을 heapify라고 ν•œλ‹€.)
2. μ •λ ¬λœ μ›μ†Œλ“€μ΄ μ €μž₯될 μƒˆλ‘œμš΄ 배열을 μƒμ„±ν•œλ‹€. (이 배열을 μ •λ ¬ 배열이라 λΆ€λ₯΄μž.)
3. νž™μ˜ λ£¨νŠΈλ…Έλ“œμ˜ 값을 μ •λ ¬ 배열에 appendν•˜κ³ , 루트 λ…Έλ“œμ˜ 값을 μ‚­μ œν•œλ‹€.
4. μ‚­μ œ ν•œ ν›„ λ‚˜λ¨Έμ§€ νŠΈλ¦¬μ— λŒ€ν•΄μ„œ λ‹€μ‹œ νž™μœΌλ‘œ λ§Œλ“ λ‹€. (heapify)
5. νž™μ— 남은 μ›μ†Œκ°€ ν•˜λ‚˜λ„ 없을 λ•ŒκΉŒμ§€ 3~4번 과정을 λ°˜λ³΅ν•œλ‹€.
6. νž™μ— 남은 μ›μ†Œκ°€ μ—†μœΌλ©΄, μ •λ ¬ λ°°μ—΄ 속 μ›μ†Œλ“€μ€ λͺ¨λ‘ 정렬이 λ˜μ–΄μžˆλ‹€. (Min Heap의 경우 μ˜€λ¦„μ°¨μˆœ, Max Heap의 경우 λ‚΄λ¦Όμ°¨μˆœμœΌλ‘œ 정렬이 λœλ‹€.)

 

νž™ μ •λ ¬ 파이썬 μ½”λ“œ

 

 

νž™ μ •λ ¬ μžλ°” μ½”λ“œ

 

 

νž™ μ •λ ¬ μž₯단점

μž₯점

  • 항상 O(NlogN)을 보μž₯
  • max λ˜λŠ” min 값을 ꡬ할 λ•Œ μ‹œκ°„ λ³΅μž‘λ„λŠ” O(1)이닀.

단점

  • 일반적으둜 μ†λ„λ§Œ λΉ„κ΅ν•˜μžλ©΄ 퀡이 ν‰κ· μ μœΌλ‘œ 더 λΉ λ₯΄λ‹€. κ·Έλž˜μ„œ 잘 μ‚¬μš©ν•˜μ§€ μ•ŠμŒ.