-
Notifications
You must be signed in to change notification settings - Fork 0
/
heap.c
74 lines (61 loc) · 1.32 KB
/
heap.c
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
#include "heap.h"
number left(number i)
{
return 2 * i;
}
number right(number i)
{
return 2 * i + 1;
}
number parent(number i)
{
return i / 2;
}
void scambia(number *a, number *b)
{
number tmp = 0;
tmp = *a;
*a = *b;
*b = tmp;
}
void MoveUp(number *A, number i)
{
while (i != 1 && A[i] > A[parent(i)])
{
scambia(&A[i], &A[parent(i)]);
i = parent(i);
}
}
void heapify(number *A, number i, size_t heap_size)
{
number l, r, largest;
l = left(i);
r = right(i);
largest = i;
if (l <= heap_size && A[l] > A[i])
largest = l;
if (r <= heap_size && A[r] > A[i] && A[r] > A[largest])
largest = r;
if (largest != i)
{
scambia(&A[i], &A[largest]);
heapify(A, largest, heap_size);
}
}
void build_heap(number *A, size_t heap_size)
{
for (size_t i = heap_size / 2; i >= 1; --i)
heapify(A, i, heap_size);
}
void heapsort(number *A, size_t size) /*Scambia l'elemento + grande in cima al vettore heap con l'elemento + piccolo alla fine, esclude l'ultimo elemento(che è diventato il + grande) e ripete l'operazione con il vettore parziale senza considerare l'ultimo elemento;*/
{
number i;
size_t heap_size;
build_heap(A, size);
heap_size = size;
for (i = size; i >= 2; --i)
{
scambia(&A[1], &A[i]);
heapify(A, 1, --heap_size);
}
}