정렬한 레코드 수에 비례하여 저장 공간이 추가로 필요하다
adjust 함수
사용 → 최대 히프를 재조정Adjust
함수 // Max Heap 만드는 함수
template<class T>
void Adjust(T* a, const int root, const int n){ // root 와 n개를 가지고 시작한다
//루트 root를 가진 이지트리를 히프 성질을 만족하도록 조정한다
// root의 왼쪽과 오른쪽 서브 트리는 현재도 히프 성질 만족함
// 어떤 노드도 n보다 큰 인덱스 가지지 않는다.
T e = a[root]; // 루트에 있는 걸 가져다가 e에 대한 적절한 위치를 탐색한다.
int j;
// 곱하기 2한게 자식이지.
for (j = 2*root; j<=n; j*=2){ //
if(j<n && a[j] < a[j+1]) // j는 parent의 가장 큰 노드
j++;
if (e >= a[j]) // e는 j의 parent로 삽입
break;
a[j/2] = a[j];
// 그 위치로 제일 작은걸 내려보낸다 (j번째 레코드를 트리 위로 이동시킨다)
}
a[j/2] =e;
}
template<class T>
void HeapSort(T* a, const int n){
for (int i = n/2, i >= 1; i--) // 히프로 바뀐다.
// 부모~root까지 가면서 계속 Adjust
Adjust(a, i, n);
for (int i = n-1; i>=1; i--){ // 정렬
swap(a[1], a[i+1]); // 현 히프의 처음과 마지막 교환
Adjust(a, 1, i); // 조정
}
}
Adjust를 반복적으로 호출 → 최대 히프 구조 만든다