힙 정렬은 이진 힙 데이터 구조를 기반으로 합니다. 바이너리 힙에서 부모 노드의 자식 노드는 최대 힙의 경우보다 작거나 같고, 부모 노드의 자식 노드는 최소 힙의 경우보다 크거나 같습니다.
힙 정렬의 모든 단계를 설명하는 예는 다음과 같습니다.
정렬 전 10개의 요소가 있는 원래 배열은 -
입니다.20 | 7 | 1 | 54 | 10 | 15 | 90 | 23 | 77 | 25 |
이 배열은 max-heapify를 사용하여 바이너리 최대 힙에 빌드됩니다. 배열로 표현되는 이 최대 힙은 다음과 같습니다.
90 | 77 | 20 | 54 | 25 | 15 | 1 | 23 | 7 | 10 |
최대 힙의 루트 요소가 추출되어 배열의 끝에 배치됩니다. 그런 다음 나머지 요소를 최대 힙으로 변환하기 위해 max heapify가 호출됩니다. 이것은 다음과 같이 주어진 정렬된 배열이 얻어질 때까지 수행됩니다. -
1 | 7 | 10 | 15 | 20 | 23 | 25 | 54 | 77 | 90 |
힙 정렬 알고리즘을 사용하여 10개의 요소로 구성된 배열을 정렬하는 프로그램은 다음과 같습니다.
예시
#include<iostream> using namespace std; void heapify(int arr[], int n, int i) { int temp; int largest = i; int l = 2 * i + 1; int r = 2 * i + 2; if (l < n && arr[l] > arr[largest]) largest = l; if (r < n && arr[r] > arr[largest]) largest = r; if (largest != i) { temp = arr[i]; arr[i] = arr[largest]; arr[largest] = temp; heapify(arr, n, largest); } } void heapSort(int arr[], int n) { int temp; for (int i = n / 2 - 1; i >= 0; i--) heapify(arr, n, i); for (int i = n - 1; i >= 0; i--) { temp = arr[0]; arr[0] = arr[i]; arr[i] = temp; heapify(arr, i, 0); } } int main() { int arr[] = { 20, 7, 1, 54, 10, 15, 90, 23, 77, 25}; int n = 10; i nt i; cout<<"Given array is: "<<endl; for (i = 0; i *lt; n; i++) cout<<arr[i]<<" "; cout<<endl; heapSort(arr, n); printf("\nSorted array is: \n"); for (i = 0; i < n; ++i) cout<<arr[i]<<" "; }
출력
Given array is: 20 7 1 54 10 15 90 23 77 25 Sorted array is: 1 7 10 15 20 23 25 54 77 90
위의 프로그램에서 heapify() 함수는 요소를 힙으로 변환하는 데 사용됩니다. 이 함수는 재귀 함수이며 호출된 요소(예:이 경우 i)에서 시작하여 최대 힙을 생성합니다. 이를 보여주는 코드 조각은 다음과 같습니다.
void heapify(int arr[], int n, int i) { int temp; int largest = i; int l = 2 * i + 1; int r = 2 * i + 2; if (l < n && arr[l] > arr[largest]) largest = l; if (r < n && arr[r] > arr[largest]) largest = r; if (largest != i) { temp = arr[i]; arr[i] = arr[largest]; arr[largest] = temp; heapify(arr, n, largest); } }
heapSort() 함수는 힙 정렬을 사용하여 배열 요소를 정렬합니다. 리프가 아닌 노드에서 시작하여 각각에서 heapify()를 호출합니다. 이것은 배열을 바이너리 최대 힙으로 변환합니다. 이것은 다음과 같이 표시됩니다 -
for (int i = n / 2 - 1; i >= 0; i--) heapify(arr, n, i);
그런 다음 heapSort() 함수는 for 루프의 각 반복에서 루트 요소를 가져와 배열의 끝에 넣습니다. 그런 다음 나머지 요소가 최대 힙인지 확인하기 위해 heapify()가 호출됩니다. 결국 이 방법을 사용하여 최대 힙에서 모든 요소를 제거하고 정렬된 배열을 얻습니다. 이것은 다음과 같이 표시됩니다.
for (int i = n - 1; i >= 0; i--) { temp = arr[0]; arr[0] = arr[i]; arr[i] = temp; heapify(arr, i, 0); }
main() 함수에서 먼저 배열이 표시됩니다. 그런 다음 heapSort() 함수를 호출하여 배열을 정렬합니다. 이것은 다음 코드 스니펫에 의해 제공됩니다.
cout<<"Given array is: "<<endl; for (i = 0; i < n; i++) cout<<arr[i]<<" "; cout<<endl; heapSort(arr, n);
마지막으로 정렬된 배열이 표시됩니다. 이것은 아래에 나와 있습니다.
printf("\nSorted array is: \n"); for (i = 0; i < n; ++i) cout<<arr[i]<<" ";