fork download
  1. def heapify(arr, n, i):
  2. """arr[0..n-1] 범위에서 i를 루트로 하는 서브트리를 힙으로 만듦"""
  3. largest = i # 루트
  4. left = 2 * i + 1 # 왼쪽 자식
  5. right = 2 * i + 2 # 오른쪽 자식
  6.  
  7. # 왼쪽 자식이 루트보다 크면 largest 갱신
  8. if left < n and arr[left] > arr[largest]:
  9. largest = left
  10.  
  11. # 오른쪽 자식이 현재 largest보다 크면 갱신
  12. if right < n and arr[right] > arr[largest]:
  13. largest = right
  14.  
  15. # 루트가 가장 큰 값이 아니면 교환 후 재귀 호출
  16. if largest != i:
  17. arr[i], arr[largest] = arr[largest], arr[i]
  18. heapify(arr, n, largest)
  19.  
  20.  
  21. def build_heap(arr):
  22. """배열을 최대 힙으로 변환"""
  23. n = len(arr)
  24. # 마지막 부모 노드부터 heapify
  25. for i in range(n // 2 - 1, -1, -1):
  26. heapify(arr, n, i)
  27.  
  28.  
  29. def heap_sort(arr):
  30. """힙 정렬 (오름차순)"""
  31. n = len(arr)
  32.  
  33. # 1. 힙 생성
  34. build_heap(arr)
  35.  
  36. # 2. 하나씩 루트(최대값)를 뒤로 보냄
  37. for i in range(n - 1, 0, -1):
  38. arr[0], arr[i] = arr[i], arr[0] # 루트와 끝 교환
  39. heapify(arr, i, 0) # 줄어든 힙에 대해 heapify
  40.  
  41.  
  42. # 실행 부분
  43. if __name__ == "__main__":
  44. arr = [5, 10, 264, 362, 865, 63, 94, 475, 135, 932,
  45. 25, 9, 33, 287, 332, 745, 377, 820, 62, 1]
  46.  
  47. # 1. 힙 생성 결과 출력
  48. heap_arr = arr[:] # 복사
  49. build_heap(heap_arr)
  50. print("1. 생성된 힙 배열:", heap_arr)
  51.  
  52. # 2. 힙 정렬 결과 출력
  53. sorted_arr = arr[:] # 복사
  54. heap_sort(sorted_arr)
  55. print("2. 정렬된 배열:", sorted_arr)
  56.  
Success #stdin #stdout 0.02s 7208KB
stdin
Standard input is empty
stdout
('1. \xec\x83\x9d\xec\x84\xb1\xeb\x90\x9c \xed\x9e\x99 \xeb\xb0\xb0\xec\x97\xb4:', [932, 865, 332, 820, 25, 63, 287, 745, 362, 10, 5, 9, 33, 264, 94, 475, 377, 135, 62, 1])
('2. \xec\xa0\x95\xeb\xa0\xac\xeb\x90\x9c \xeb\xb0\xb0\xec\x97\xb4:', [1, 5, 9, 10, 25, 33, 62, 63, 94, 135, 264, 287, 332, 362, 377, 475, 745, 820, 865, 932])