10
10
11
11
LOG_MODULE_REGISTER (min_heap );
12
12
13
- /**
14
- * @brief Swap two elements in the heap.
15
- *
16
- * This function swaps the contents of two elements at the specified indices
17
- * within the heap.
18
- *
19
- * @param heap Pointer to the min-heap.
20
- * @param a Index of the first element.
21
- * @param b Index of the second element.
22
- */
23
- static void swap (struct min_heap * heap , size_t a , size_t b )
24
- {
25
- uint8_t tmp [heap -> elem_size ];
26
- void * elem_a = min_heap_get_element (heap , a );
27
- void * elem_b = min_heap_get_element (heap , b );
28
-
29
- memcpy (tmp , elem_a , heap -> elem_size );
30
- memcpy (elem_a , elem_b , heap -> elem_size );
31
- memcpy (elem_b , tmp , heap -> elem_size );
32
- }
33
-
34
13
/**
35
14
* @brief Restore heap order by moving a node up the tree.
36
15
*
@@ -42,17 +21,15 @@ static void swap(struct min_heap *heap, size_t a, size_t b)
42
21
*/
43
22
static void heapify_up (struct min_heap * heap , size_t index )
44
23
{
45
- size_t parent ;
46
- void * curr , * par ;
47
-
48
24
while (index > 0 ) {
49
- parent = (index - 1 ) / 2 ;
50
- curr = min_heap_get_element (heap , index );
51
- par = min_heap_get_element (heap , parent );
25
+ size_t parent = (index - 1 ) / 2 ;
26
+ void * curr = min_heap_get_element (heap , index );
27
+ void * par = min_heap_get_element (heap , parent );
28
+
52
29
if (heap -> cmp (curr , par ) >= 0 ) {
53
30
break ;
54
31
}
55
- swap ( heap , index , parent );
32
+ byteswp ( curr , par , heap -> elem_size );
56
33
index = parent ;
57
34
}
58
35
}
@@ -69,30 +46,34 @@ static void heapify_up(struct min_heap *heap, size_t index)
69
46
70
47
static void heapify_down (struct min_heap * heap , size_t index )
71
48
{
72
- size_t left , right , smallest ;
49
+ /* Terminate the loop naturally when the left child is out of bounds */
50
+ for (size_t left = 2 * index + 1 ; left < heap -> size ; left = 2 * index + 1 ) {
73
51
74
- while (true) {
75
- left = 2 * index + 1 ;
76
- right = 2 * index + 2 ;
77
- smallest = index ;
52
+ size_t right = left + 1 ;
53
+ size_t smallest = index ;
54
+ void * elem_index = min_heap_get_element (heap , index );
55
+ void * elem_left = min_heap_get_element (heap , left );
56
+ void * elem_smallest = elem_index ;
78
57
79
- if (left < heap -> size &&
80
- heap -> cmp (min_heap_get_element (heap , left ),
81
- min_heap_get_element (heap , smallest )) < 0 ) {
58
+ if (heap -> cmp (elem_left , elem_index ) < 0 ) {
82
59
smallest = left ;
60
+ elem_smallest = elem_left ;
83
61
}
84
62
85
- if (right < heap -> size &&
86
- heap -> cmp (min_heap_get_element (heap , right ),
87
- min_heap_get_element (heap , smallest )) < 0 ) {
88
- smallest = right ;
63
+ if (right < heap -> size ) {
64
+ void * elem_right = min_heap_get_element (heap , right );
65
+
66
+ if (heap -> cmp (elem_right , elem_smallest ) < 0 ) {
67
+ smallest = right ;
68
+ elem_smallest = elem_right ;
69
+ }
89
70
}
90
71
91
72
if (smallest == index ) {
92
73
break ;
93
74
}
94
75
95
- swap ( heap , index , smallest );
76
+ byteswp ( elem_index , elem_smallest , heap -> elem_size );
96
77
index = smallest ;
97
78
}
98
79
}
0 commit comments