Skip to content

Commit a711788

Browse files
authored
Created heapSort.cpp
Added implementation of heap Sort in c++.
1 parent 3876364 commit a711788

File tree

1 file changed

+80
-0
lines changed

1 file changed

+80
-0
lines changed

sort_search_problems/heapSort.cpp

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
#include<iostream>
2+
using namespace std;
3+
4+
5+
void maxHeapify(int*, int, int);
6+
void buildHeap(int*, int);
7+
void heapsort(int*, int);
8+
9+
int main() {
10+
11+
int arr[] = { 4,2,3,1,5,6,8,};
12+
13+
heapsort(arr, sizeof(arr) / sizeof(int));
14+
15+
for (int i = 0; i < sizeof(arr) / sizeof(int); i++) {
16+
cout << arr[i] << " ";
17+
}
18+
19+
return 0;
20+
}
21+
22+
void maxHeapify(int* arr, int n, int i) {
23+
if (i > n / 2 - 1) {
24+
//if index of element is greater than i/2 it is in the last level of the heap. no need to call maxHeapify for it.
25+
return;
26+
}
27+
if (arr[i] > arr[2 * i] && arr[i] > arr[(2 * i) + 1]) {
28+
//heap property already satisfied.
29+
return;
30+
}
31+
32+
int maxInx = i, temp;
33+
34+
while (i <= (n / 2 - 1)) {
35+
//finding the index of the largest child of i.
36+
if (arr[2 * i + 1] > arr[i] && (2 * i + 1) < n) {
37+
maxInx = 2 * i + 1;
38+
}
39+
if (arr[(2 * i) + 2] > arr[maxInx] && (2 * i + 2) < n) {
40+
maxInx = (2 * i) + 2;
41+
}
42+
//if no change occurs. then return.
43+
if (i == maxInx) { return; }
44+
45+
//having obtained the index of the largest node swap it with i.
46+
//swapping arr[i] with arr[maxInx]
47+
temp = arr[maxInx];
48+
arr[maxInx] = arr[i];
49+
arr[i] = temp;
50+
i = maxInx;
51+
}
52+
53+
}
54+
55+
void buildHeap(int* arr, int n) {
56+
//start calling from the last parent in the heap(n/2) and go upto the root node.
57+
//start from the last parent instead of root because here the loop invacriant is that heap condition is
58+
//satisfied for all nodes other than the one for which it is called. which would not be true when it is
59+
//called for the root node of the array when the array is compeletely random.
60+
//refer to CORMEN for more details.
61+
for (int i = (n / 2 - 1); i >= 0; i--) {
62+
maxHeapify(arr, n, i);
63+
}
64+
}
65+
66+
void heapsort(int* arr, int n) {
67+
buildHeap(arr, n);
68+
69+
int temp;
70+
while (n > 0) {
71+
//after the heap is built take the element a[0], swap it with the last element, discard it and call maxheapify
72+
//for the root element
73+
74+
temp = arr[n - 1];
75+
arr[n - 1] = arr[0];
76+
arr[0] = temp;
77+
n--;
78+
maxHeapify(arr, n, 0);
79+
}
80+
}

0 commit comments

Comments
 (0)