Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

힙 정렬 알고리즘을 사용하여 10개 요소의 배열을 정렬하는 C++ 프로그램

<시간/>

힙 정렬은 이진 힙 데이터 구조를 기반으로 합니다. 바이너리 힙에서 부모 노드의 자식 노드는 최대 힙의 경우보다 작거나 같고, 부모 노드의 자식 노드는 최소 힙의 경우보다 크거나 같습니다.

힙 정렬의 모든 단계를 설명하는 예는 다음과 같습니다.

정렬 전 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]<<" ";