Skip to content

Commit d17fcd1

Browse files
committed
Refactored heap down function in binary heap.
1 parent 4b1daff commit d17fcd1

File tree

2 files changed

+13
-19
lines changed

2 files changed

+13
-19
lines changed

DataStructure/Trees/Sources/BinaryHeap.c

+12-18
Original file line numberDiff line numberDiff line change
@@ -101,28 +101,22 @@ void binaryHeapDown(void **arr, int currentIndex, int length, int (*cmp)(const v
101101
if (currentIndex >= length)
102102
return;
103103

104-
int fChildIndex = binaryHeapGetFChildIndex(currentIndex);
105-
int sChildIndex = binaryHeapGetSChildIndex(currentIndex);
104+
int fChildIndex = binaryHeapGetFChildIndex(currentIndex),
105+
sChildIndex = binaryHeapGetSChildIndex(currentIndex),
106+
targetChildIndex = -1;
106107

107-
fChildIndex = fChildIndex >= length ? currentIndex : fChildIndex;
108-
sChildIndex = sChildIndex >= length ? currentIndex : sChildIndex;
108+
if (fChildIndex < length || sChildIndex < length) {
109109

110-
if (cmp(arr[currentIndex], arr[fChildIndex]) < 0 && cmp(arr[currentIndex], arr[sChildIndex]) < 0) {
110+
if (fChildIndex < length && sChildIndex < length)
111+
targetChildIndex = cmp(arr[fChildIndex], arr[sChildIndex]) > 0 ? fChildIndex : sChildIndex;
112+
else
113+
targetChildIndex = fChildIndex >= length ? sChildIndex : fChildIndex;
111114

112-
int biggestChildIndex = cmp(arr[fChildIndex], arr[sChildIndex]) < 0 ? sChildIndex : fChildIndex;
113-
binaryHeapSwap(arr, currentIndex, biggestChildIndex);
114-
binaryHeapDown(arr, biggestChildIndex, length, cmp);
115-
116-
} else if (cmp(arr[currentIndex], arr[fChildIndex]) < 0) {
117-
118-
binaryHeapSwap(arr, currentIndex, fChildIndex);
119-
binaryHeapDown(arr, fChildIndex, length, cmp);
120-
121-
} else if (cmp(arr[currentIndex], arr[sChildIndex]) < 0) {
122-
123-
binaryHeapSwap(arr, currentIndex, sChildIndex);
124-
binaryHeapDown(arr, sChildIndex, length, cmp);
115+
}
125116

117+
if (targetChildIndex != -1 && cmp(arr[targetChildIndex], arr[currentIndex]) > 0) {
118+
binaryHeapSwap(arr, currentIndex, targetChildIndex);
119+
binaryHeapDown(arr, targetChildIndex, length, cmp);
126120
}
127121

128122
}

Unit Test/Tests/DataStructuresTests/DequesTest/DoublyLinkedListDequeTest/DoublyLinkedListDequeTest.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -472,7 +472,7 @@ void doublyLinkedListDequeUnitTest(void) {
472472
ERROR_TEST = (ErrorTestStruct *) malloc(sizeof(ErrorTestStruct));
473473

474474
CuString *output = CuStringNew();
475-
CuStringAppend(output, "**Doubly Linked List dLDeque Test**\n");
475+
CuStringAppend(output, "**Doubly Linked List Deque Test**\n");
476476

477477
CuSuite *suite = createDoublyLinkedListDequeTestsSuite();
478478

0 commit comments

Comments
 (0)