-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathheap.cpp
executable file
·79 lines (61 loc) · 1.88 KB
/
heap.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
#include <iostream>
using namespace std;
int n = 12; //nr de elemente
int a[] = {0, 10, 12, 7, 8, 18, 20, 15, 3, 9, 5, 42, 2};
//da-mi maximul intre doua pozitii din heap (in general intre 2*i si 2*i+1, copii unui nod)
int pmax(int i, int j){
//daca j-ul e o frunza inexistenta (posibil in cazul in care nr de elemente este par)
if(j > n){
return i;
}
if(a[i] > a[j]){
return i;
}
return j;
}
//insereaza un element la locul lui in heap
void down(int i){
//verific ca i <= n/2 ca sa nu ies din vector cand fac a[2*i] si a[2*i+1]
if(i <= n/2){
if(a[i] > a[2*i] && a[i] > a[2*i+1]){
//daca conditia heap-ului e indeplinita, inseamna ca a[i] e la locul potrivit
return;
}
//conditia heap-ului nu e indepinita:
//afla maximul dintre cei doi copii ai noduluio curent
int p = pmax(2*i, 2*i+1);
//schimba valoarea nodului curent cu maximul dintre copii
swap(a[i], a[p]);
//maximul acum e pe pozitia p
//impinge mai departe elementul de pe pozitia p, in caz in care inca nu a ajuns la locul potrivit
down(p);
}
}
//sorteaza un heap
void heap_sort(){
while(n > 1){
swap(a[1], a[n]); //schimba elementul din radacina cu ultima frunza (cel mai mare cu cel mai mic)
n--; //scade n-ul, pt. ca nu ma mai intereseaza ultima frunza
down(1); //impinge elementul din radacina (acum cel mai mic) la locul lui
//continua pana cand n-ul e mai mic ca 1 ca atunci am ajuns sa imping doar un element in heap, care sigur e la locul lui,
// ca nu are copii care pot fi mai mari decat el
}
}
int main(){
//make heap
//insereaza in heap, incep de la jumatate pt. ca down va verifica oricum elementele 2*i si 2*i+1, care sunt la "capat"
for(int i=n/2; i>=1; i--){
down(i);
}
for(int i=1; i<=n; i++){
cout<<a[i]<< " ";
}
//salvez n-ul ca heap_sort mi-l modifica
int m = n;
heap_sort();
n=m;
cout<<"\nDupa heapSort:\n";
for(int i=1; i<=n; i++){
cout<<a[i]<< " ";
}
}