728x90
반응형
힙 정렬
: 힙은 완전 이진트리의 구조를 갖고 있는데, 자식 노드의 값이 부모 노드의 값보다 클 수 없다(작거나 같아야 함)는 조건을 만족해야 한다.
1. 최대 힙을 구성한다. (인덱스의 0번째 값이 최댓값이 된다)
2. 최댓값을 배열의 가장 마지막 위치에 놓는다. (큰 값을 뒤로 보내주는 과정 - 교환)
3. 그 다음 새로운 루트 노드에 대해 최대 힙을 수행한다.
4. 원소의 개수만큼 2~3번의 과정을 반복한다.
주어진 자료 구조에서 힙 성질을 만족하도록 하는 연산을 heapify라고 한다!!!
heapify에서는 left = index * 2 +1, right = index * 2 + 2 공식을 만족한다.
파이썬으로 구현한 힙 정렬
def heapify(arr, index, heap_size): largest = index left = index * 2 + 1 # 왼쪽 자노드 right = index * 2 + 2 # 오른쪽 자노드 # 왼쪽 자식이 현재 요소보다 크면 인덱스 교체! if left < heap_size and arr[left] > arr[largest]: largest = left # 오른쪽 자식이 현재 요소보다 크면 인덱스 교체! if right < heap_size and arr[right] > arr[largest]: largest = right # 교체된 적이 있다면 교체된 index와 largest 요소값 교체! if largest != index: arr[largest], arr[index] = arr[index], arr[largest] # 변경된 부분을 중심으로 다시 한번 heapify heapify(arr, largest, heap_size) def heap_sort(arr): n = len(arr) # 최초 힙 # 트리의 절반부터 거꾸로 올라가며 하는 것이 효율적 for i in range(n // 2 -1, -1, -1): heapify(arr, i, n) # 한번 구성된 힙을 정렬 # 가장 큰 값(루트) 을 가장 끝 값으로 이동한 후 힙 생성. for i in range(n-1, 0, -1): arr[0], arr[i] = arr[i], arr[0] heapify(arr, 0, i) return arr arr = [5, 2, 3, 9, 6, 1, 8, 4, 7] print(heap_sort(arr))
728x90
반응형
'Algorithm > Sorting Algorithm' 카테고리의 다른 글
합병 정렬 (Merge Sort) (0) | 2021.07.14 |
---|---|
삽입 정렬 (Insertion Sort) (0) | 2021.07.14 |
퀵 정렬 (Quick Sort) (0) | 2021.07.13 |
선택 정렬 (Selection Sort) (0) | 2021.07.13 |
버블 정렬 (Bubble Sort) (0) | 2021.07.13 |