[자료ꡬ쑰] νž™μ •λ ¬(Heap Sort)μ΄λž€?

2022. 12. 15. 17:36Β·πŸ“š 자료ꡬ쑰 및 μ•Œκ³ λ¦¬μ¦˜/μ •λ ¬ 및 탐색
728x90

νž™μ •λ ¬μ΄λž€

2022.10.13 - [πŸ“š 자료ꡬ쑰 및 μ•Œκ³ λ¦¬μ¦˜/νž™] - [자료ꡬ쑰] νž™(Heap)μ΄λž€?

 

[자료ꡬ쑰] νž™(Heap)μ΄λž€?

νž™μ΄λž€? μ™„μ „μ΄μ§„νŠΈλ¦¬μ˜ 일쒅이닀. νž™μ€ μ€‘λ³΅λœ 값을 ν—ˆμš©ν•œλ‹€. μ—¬λŸ¬ κ°’λ“€ 쀑 μ΅œλŒ€κ°’ ν˜Ήμ€ μ΅œμ†Œκ°’μ„ λΉ λ₯΄κ²Œ μ°Ύμ•„λ‚΄κΈ° μœ„ν•œ μžλ£Œκ΅¬μ‘°μ΄λ‹€. Max heap은 κ°€μž₯ 큰 값을 λΉ λ₯΄κ²Œ μ°ΎκΈ° μœ„ν•œ 것이고 Min Heap

linerate.tistory.com

합병 정렬방식은 비둝 μ΅œμ•…μ˜ 경우 μ—°μ‚° μ‹œκ°„κ³Ό 평균 μ—°μ‚° μ‹œκ°„ λͺ¨λ‘ O(nlogn)μ΄μ§€λ§Œ, μ •λ ¬ν•  λ ˆμ½”λ“œ μˆ˜μ— λΉ„λ‘€ν•˜μ—¬ μ €μž₯ 곡간이 μΆ”κ°€λ‘œ ν•„μš”ν•˜λ‹€. νž™ μ •λ ¬(heap sort)은 μΌμ •ν•œ μ–‘μ˜ μ €μž₯ κ³΅κ°„λ§Œ μΆ”κ°€μ μœΌλ‘œ ν•„μš”ν•œ λ™μ‹œμ—, μ΅œμ•…μ˜ 경우 평균 μ—°μ‚° μ‹œκ°„μ΄ O(n log n)이닀. ν•˜μ§€λ§Œ, νž™ 정렬은 합병 정렬보닀 μ•½κ°„ λŠλ¦¬λ‹€. νž™ μ •λ ¬μ˜ 핡심 μ•Œλ‘œλ¦¬μ¦˜μ€ μ΄λ¦„μ²˜λŸΌ νž™λ₯Ό μ‚¬μš©ν•œλ‹€. κ·Έμ€‘μ—μ„œλ„ μ΅œλŒ€ νž™ ꡬ쑰λ₯Ό μ΄μš©ν•œλ‹€. λ”°λΌμ„œ, μ΅œλŒ€ νžˆν”„κ°€ λ˜λ„λ‘ λ ˆμ½”λ“œλ₯Ό μž¬μ‘°μ • ν›„ 루트λ₯Ό ν•˜λ‚˜μ”© λΉΌλ‚΄λ©΄μ„œ 정렬을 ν•˜λŠ” 기법이닀.
 

즉, νž™μ •λ ¬μ˜ μ•Œκ³ λ¦¬μ¦˜μ€

  1. μ •λ ¬ν•  n개의 μš”μ†Œλ₯Ό μ΅œλŒ€ νž™μ— μ‚½μž…
  2. ν•œλ²ˆμ— ν•˜λ‚˜μ”© νž™μ—μ„œ μ‚­μ œν•˜μ—¬ μ €μž₯
  3. νž™ 크기 κ°μ†Œ 및 μž¬μ‘°μ •
  4. n-1 반볡
  • νž™μ— μ‚½μž…ν•˜κ±°λ‚˜ μ‚­μ œν•  λ•Œ μ‹œκ°„μ΄ O(logN)만큼 μ†Œμš”λ˜κ³  μš”μ†Œμ˜ κ°œμˆ˜κ°€ nκ°œμ΄λ―€λ‘œ μ „μ²΄μ μœΌλ‘œ O(NlogN)의 μ‹œκ°„μ΄ κ±Έλ¦°λ‹€.
  • νž™μ •λ ¬μ΄ μ΅œλŒ€λ‘œ μœ μš©ν•œ κ²½μš°λŠ” 전체 자료λ₯Ό μ •λ ¬ν•˜λŠ” 것이 μ•„λ‹ˆλΌ κ°€μž₯ 큰 κ°’ λͺ‡ 개만 ν•„μš”ν•  λ•Œμ΄λ‹€.

 

 

Adjust ν•¨μˆ˜

  • μ™Όμͺ½ 및 였λ₯Έμͺ½ μ„œλΈŒ νŠΈλ¦¬κ°€ λͺ¨λ‘ νžˆν”„μΈ 이진 νŠΈλ¦¬μ—μ„œ μ‹œμž‘ν•΄ 이진 트리 전체가 μ΅œλŒ€ νžˆν”„κ°€ λ˜λ„λ‘ μž¬μ‘°μ •
  • μ—°μ‚° μ‹œκ°„ : O(d) (dλŠ” 트리의 깊이)
// μ΅œλŒ€ νž™(max heap) μ‚­μ œ ν•¨μˆ˜
element delete_max_heap(HeapType *h){
  int parent, child;
  element item, temp;

  item = h->heap[1]; // 루트 λ…Έλ“œ 값을 λ°˜ν™˜ν•˜κΈ° μœ„ν•΄ item에 ν• λ‹Ή
  temp = h->heap[(h->heap_size)--]; // λ§ˆμ§€λ§‰ λ…Έλ“œλ₯Ό temp에 ν• λ‹Ήν•˜κ³  νž™ 크기λ₯Ό ν•˜λ‚˜ κ°μ†Œ
  parent = 1;
  child = 2;

  while(child <= h->heap_size){
    // ν˜„μž¬ λ…Έλ“œμ˜ μžμ‹ λ…Έλ“œ 쀑 더 큰 μžμ‹ λ…Έλ“œλ₯Ό μ°ΎλŠ”λ‹€. (루트 λ…Έλ“œμ˜ μ™Όμͺ½ μžμ‹ λ…Έλ“œ(index: 2)λΆ€ν„° 비ꡐ μ‹œμž‘)
    if( (child < h->heap_size) && ((h->heap[child].key) < h->heap[child+1].key) ){
      child++;
    }
    // 더 큰 μžμ‹ λ…Έλ“œλ³΄λ‹€ λ§ˆμ§€λ§‰ λ…Έλ“œκ°€ 크면, whileλ¬Έ 쀑지
    if( temp.key >= h->heap[child].key ){
      break;
    }

    // 더 큰 μžμ‹ λ…Έλ“œλ³΄λ‹€ λ§ˆμ§€λ§‰ λ…Έλ“œκ°€ μž‘μœΌλ©΄, λΆ€λͺ¨ λ…Έλ“œμ™€ 더 큰 μžμ‹ λ…Έλ“œλ₯Ό κ΅ν™˜
    h->heap[parent] = h->heap[child];
    // ν•œ 단계 μ•„λž˜λ‘œ 이동
    parent = child;
    child *= 2;
  }

  // λ§ˆμ§€λ§‰ λ…Έλ“œλ₯Ό μž¬κ΅¬μ„±ν•œ μœ„μΉ˜μ— μ‚½μž…
  h->heap[parent] = temp;
  // μ΅œλŒ“κ°’(루트 λ…Έλ“œ κ°’)을 λ°˜ν™˜
  return item;
}
https://gmlwjd9405.github.io/2018/05/10/algorithm-heap-sort.html
  1. λ£¨νŠΈκ°’μ„ item에 μž„μ‹œ μ €μž₯
  2. tempμ—λŠ” λ§ˆμ§€λ§‰ λ…Έλ“œμ˜ 값을 μ €μž₯ν•˜κ³  size 1κ°μ†Œ
  3. ν˜„μž¬ 루트 λ…Έλ“œμ˜ μ™Όμͺ½ μžμ‹ λ…Έλ“œλΆ€ν„° 비ꡐ μ‹œμž‘
  4. λ§Œμ•½ μ™Όμͺ½λ³΄λ‹€ 였λ₯Έμͺ½ λ…Έλ“œκ°€ 더 크닀면 child값을 μ¦κ°€μ‹œμΌœμ„œ 였λ₯Έμͺ½ λ…Έλ“œλ‘œ λ³€κ²½
  5. 2개의 μžμ‹λ³΄λ‹€ λ£¨νŠΈλ…Έλ“œκ°€ 크면 whileλ¬Έ νƒˆμΆœ
  6. λΆ€λͺ¨λ…Έλ“œκ°€ μžμ‹λ…Έλ“œλ³΄λ‹€ μž‘μœΌλ©΄ κ·Έ μžμ‹λ…Έλ“œμ™€ κ΅ν™˜ ( λΆ€λͺ¨λ…Έλ“œμ— μžμ‹λ…Έλ“œκ°’ λŒ€μž… )
  7. ν•œ 단계 μ•„λž˜λ‘œ 이동해주고 λ§ˆμ§€λ§‰λ…Έλ“œλ₯Ό μž¬κ΅¬μ„±ν•œ μœ„μΉ˜μ— μ‚½μž…

 

νž™μ •λ ¬ μ‹œκ°„λ³΅μž‘λ„

νž™ 트리의 전체 높이가 거의 logβ‚‚n(μ™„μ „ 이진 νŠΈλ¦¬μ΄λ―€λ‘œ)μ΄λ―€λ‘œ ν•˜λ‚˜μ˜ μš”μ†Œλ₯Ό νž™μ— μ‚½μž…ν•˜κ±°λ‚˜ μ‚­μ œν•  λ•Œ νž™μ„ μž¬μ •λΉ„ν•˜λŠ” μ‹œκ°„μ΄ logβ‚‚n만큼 μ†Œμš”λœλ‹€. μš”μ†Œμ˜ κ°œμˆ˜κ°€ n개 μ΄λ―€λ‘œ μ „μ²΄μ μœΌλ‘œ O(nlogβ‚‚n)의 μ‹œκ°„이 κ±Έλ¦°λ‹€.
T(n) = O(nlogβ‚‚n)

728x90
μ €μž‘μžν‘œμ‹œ (μƒˆμ°½μ—΄λ¦Ό)
'πŸ“š 자료ꡬ쑰 및 μ•Œκ³ λ¦¬μ¦˜/μ •λ ¬ 및 탐색' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
  • [μ•Œκ³ λ¦¬μ¦˜] 선택 μ •λ ¬(Selection Sort)μ΄λž€?
  • [μ•Œκ³ λ¦¬μ¦˜] μœ„μƒ μ •λ ¬(Topological Sort)μ΄λž€?
  • 병합 μ •λ ¬(Merge Sort)μ΄λž€?
  • μ •λ ¬(Sort Algorithm)μ΄λž€?
juno1105
juno1105
κ³΅λΆ€ν•˜λŠ” κ²Έ 포폴 λΈ”λ‘œκ·Έ
  • juno1105
    @juno1105
    juno1105
  • 전체
    였늘
    μ–΄μ œ
    • λΆ„λ₯˜ 전체보기 (89)
      • πŸ’¬ 자유 (3)
      • πŸ“– μ–΄ν•™ 곡뢀 (0)
      • πŸ“” 개발 ν”„λ‘œμ νŠΈ (4)
      • πŸ›  ν”„λ‘œκ·Έλž¨ 였λ₯˜ 해결법 (1)
      • πŸ“š 자료ꡬ쑰 및 μ•Œκ³ λ¦¬μ¦˜ (53)
        • μŠ€νƒ (4)
        • 큐 (4)
        • μ •λ ¬ 및 탐색 (17)
        • 리슀트 (5)
        • ν•΄μ‹œ (1)
        • 트리 (8)
        • νž™ (2)
        • κ·Έλž˜ν”„ (12)
      • πŸ’» 컴퓨터 ꡬ쑰 (0)
      • πŸš₯ λ…Όλ¦¬νšŒλ‘œ (8)
      • πŸ”° λ°±μ€€ (20)
        • 큐, μŠ€νƒ, 덱 (0)
        • DFS 와 BFS (3)
        • 그리디 (0)
        • λ™μ κ³„νšλ²• 1 (16)
        • λ™μ κ³„νšλ²• 2 (0)
        • μ΅œλ‹¨ 경둜 (0)
        • 트리 (0)
        • λ°±νŠΈλž˜ν‚Ή (0)
        • μœ λ‹ˆμ˜¨ νŒŒμΈλ“œ (0)
        • μ§‘ν•©κ³Ό λ§΅ (1)
      • 🌈 ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ (0)
      • πŸ“± μ•ˆλ“œλ‘œμ΄λ“œ μ•± (0)
  • λΈ”λ‘œκ·Έ 메뉴

    • ν™ˆ
    • νƒœκ·Έ
    • λ°©λͺ…둝
  • 링크

  • 곡지사항

    • ✨자료ꡬ쑰 μ•Œκ³ λ¦¬μ¦˜ 컀리큘럼✨
  • 인기 κΈ€

  • νƒœκ·Έ

    토읡 910점
    λΉ…μ˜€ν‘œκΈ°λ²•
    토읡
    κ·Έλž˜ν”„νƒμƒ‰
    토읡 900μ λŒ€
    토읡 920점
    토읡 900점
    μ΅œλ‹¨κ²½λ‘œ
    μ •λ ¬
    μ •λ ¬ μ΅œμ„ μ˜ 경우
    μ‹œκ°„λ³΅μž‘λ„
    μ •λ ¬ μ΅œμ•…μ˜ 경우
    토읡 900
    μ•Œκ³ λ¦¬μ¦˜
    토읡 950점
  • 졜근 λŒ“κΈ€

  • 졜근 κΈ€

  • hELLOΒ· Designed Byμ •μƒμš°.v4.10.3
juno1105
[자료ꡬ쑰] νž™μ •λ ¬(Heap Sort)μ΄λž€?
μƒλ‹¨μœΌλ‘œ

ν‹°μŠ€ν† λ¦¬νˆ΄λ°”