-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathBinaryHeap.cpp
105 lines (84 loc) · 2.02 KB
/
BinaryHeap.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
//
// Created by abel_ on 14-06-2022.
//
#include<bits/stdc++.h>
using namespace std;
void _siftup(int i,int arr[]){
int parent = (i-1)/2;
while(i!=0 && arr[i]<arr[parent]){
swap(arr[i],arr[parent]);
i = parent;
parent = (i-1)/2;
}
}
void _siftdown(int i,int arr[]) {
int left = 2 * i + 1;
int right = 2 * i + 2;
int len_arr = sizeof(arr) / sizeof(arr[0]);
while ((left < len_arr && arr[i] > arr[left]) or
(right < len_arr && arr[i] > arr[right])) {
if (right >= len_arr or arr[left] < arr[right]) {
swap(arr[i], arr[left]);
i = left;
} else {
swap(arr[i], arr[right]);
i = right;
}
left = 2 * i + 1;
right = 2 * i + 2;
}
}
void insert(int element,int arr[]) {
int len_arr = sizeof(arr) / sizeof(arr[0]);
arr[len_arr] = element;
_siftup(len_arr,arr);
}
int getMin(int arr[]) {
return arr[0];
}
int extractMin(int arr[]) {
int len_arr = sizeof(arr) / sizeof(arr[0]);
int min = arr[0];
swap(arr[0], arr[len_arr-1]);
arr[len_arr-1] = 0;
_siftdown(0,arr);
return min;
}
void update_by_index(int index,int element,int arr[]) {
int old = arr[index];
arr[index] = element;
if(old<element){
_siftup(index,arr);
}else{
_siftdown(index,arr);
}
}
void update(int old,int element,int arr[]) {
for(int i=0;i<sizeof(arr)/sizeof(arr[0]);i++){
if(arr[i]==old){
update_by_index(i,element,arr);
break;
}
}
}
void heapify(int *arr[]) {
for(int i=sizeof(arr)/sizeof(arr[0])-1;i>=0;i--){
_siftdown(i,*arr);
}
}
int main(){
int arr[14]={9,11,18,13,15,14,
7,8,12,10,4,6,3};
// print array
for(int i=0;i<sizeof(arr)/sizeof(arr[0]);i++){
cout << arr[i] << " ";
}
cout << endl;
heapify(arr);
// print array
for(int i=0;i<sizeof(arr)/sizeof(arr[0]);i++){
cout << arr[i] << " ";
}
cout << endl;
return 0;
}