Skip to content

Commit 01ba460

Browse files
committed
Rename members and add tests
1 parent 369cbeb commit 01ba460

File tree

3 files changed

+119
-110
lines changed

3 files changed

+119
-110
lines changed

src/main/java/com/thealgorithms/datastructures/heaps/LeonardoHeap.java

Lines changed: 50 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -10,129 +10,113 @@
1010
*/
1111
public class LeonardoHeap<T extends Comparable<T>> {
1212

13-
private int leonardoLevelTracker;
14-
private int leonardoHeapSize;
15-
private final List<T> leonardoHeap;
13+
private int levelTracker = 0;
14+
private final List<T> heap = new ArrayList<T>();
1615

1716
public LeonardoHeap() {
18-
this.leonardoHeap = new ArrayList<T>();
19-
this.leonardoLevelTracker = 0;
20-
this.leonardoHeapSize = 0;
2117
}
2218

23-
public int getHeapsize() {
24-
return this.leonardoHeapSize;
25-
}
26-
27-
private void decreaseLeonardoLevelTracker() {
19+
private void decreaseLevelTracker() {
2820
int lastTreeLevel = getRightMostTree();
29-
leonardoLevelTracker = SingleBitOperations.clearBit(leonardoLevelTracker, lastTreeLevel);
21+
levelTracker = SingleBitOperations.clearBit(levelTracker, lastTreeLevel);
3022
if (lastTreeLevel != 0 && lastTreeLevel != 1) {
31-
leonardoLevelTracker = SingleBitOperations.setBit(leonardoLevelTracker, lastTreeLevel - 1);
32-
leonardoLevelTracker = SingleBitOperations.setBit(leonardoLevelTracker, lastTreeLevel - 2);
23+
levelTracker = SingleBitOperations.setBit(levelTracker, lastTreeLevel - 1);
24+
levelTracker = SingleBitOperations.setBit(levelTracker, lastTreeLevel - 2);
3325
}
3426
}
3527

36-
private void increaseLeonardoLevelTracker() {
37-
ArrayList<Integer> consecutiveTreeIndices = findConsecutiveLeonardoTreeIndices(leonardoLevelTracker);
28+
private void increaseLevelTracker() {
29+
ArrayList<Integer> consecutiveTreeIndices = findConsecutiveTreeIndices(levelTracker);
3830
if (consecutiveTreeIndices.get(0) != -1) {
3931
// if 0th or 1st index is -1 that implies there are no concequtive trees
40-
leonardoLevelTracker = SingleBitOperations.clearBit(leonardoLevelTracker, consecutiveTreeIndices.get(0));
41-
leonardoLevelTracker = SingleBitOperations.clearBit(leonardoLevelTracker, consecutiveTreeIndices.get(1));
42-
leonardoLevelTracker = SingleBitOperations.setBit(leonardoLevelTracker, consecutiveTreeIndices.get(1) + 1);
43-
} else if ((leonardoLevelTracker & 2) == 0) {
44-
leonardoLevelTracker = SingleBitOperations.setBit(leonardoLevelTracker, 1);
32+
levelTracker = SingleBitOperations.clearBit(levelTracker, consecutiveTreeIndices.get(0));
33+
levelTracker = SingleBitOperations.clearBit(levelTracker, consecutiveTreeIndices.get(1));
34+
levelTracker = SingleBitOperations.setBit(levelTracker, consecutiveTreeIndices.get(1) + 1);
35+
} else if ((levelTracker & 2) == 0) {
36+
levelTracker = SingleBitOperations.setBit(levelTracker, 1);
4537
} else {
46-
leonardoLevelTracker = SingleBitOperations.setBit(leonardoLevelTracker, 0);
38+
levelTracker = SingleBitOperations.setBit(levelTracker, 0);
4739
}
4840
}
4941

50-
private void decreaseHeapSize() {
51-
this.leonardoHeapSize--;
52-
}
53-
54-
private void increaseHeapSize() {
55-
this.leonardoHeapSize++;
56-
}
57-
58-
private void maxHeapifyLeonardoTree(int rootNodeIndex, int currentLeonardoLevel) {
42+
private void maxHeapifyTree(int rootNodeIndex, int currentLevel) {
5943
// A leonardo tree of level n is just 1 node(the root) plus the leonardo tree of n-1 level(left child) plus leonardo tree of n-2 level(right child)
6044
// To maxheapify a leonardo tree we need to compare the current root and roots of it's left and right subtree
61-
// We recursively hepify the left and right subtrees using the currentLeonardoLevel
45+
// We recursively hepify the left and right subtrees using the currentLevel
6246

6347
// BASE CASE
64-
if (currentLeonardoLevel == 0 || currentLeonardoLevel == 1) {
48+
if (currentLevel == 0 || currentLevel == 1) {
6549
return; // Trees with one node are in already max-heapified.
6650
}
6751

6852
int currentRootNodeIndex = rootNodeIndex;
6953
int rightChildIndex = rootNodeIndex - 1;
70-
int leftChildIndex = rootNodeIndex - LeonardoNumber.leonardoNumber(currentLeonardoLevel - 2) - 1;
54+
int leftChildIndex = rootNodeIndex - LeonardoNumber.leonardoNumber(currentLevel - 2) - 1;
7155
int childIndexForSwap = -1;
7256

73-
if (leonardoHeap.get(rightChildIndex).compareTo(leonardoHeap.get(leftChildIndex)) >= 0) {
57+
if (heap.get(rightChildIndex).compareTo(heap.get(leftChildIndex)) >= 0) {
7458
childIndexForSwap = rightChildIndex;
7559
} else {
7660
childIndexForSwap = leftChildIndex;
7761
}
7862

79-
if (leonardoHeap.get(childIndexForSwap).compareTo(leonardoHeap.get(currentRootNodeIndex)) > 0) {
63+
if (heap.get(childIndexForSwap).compareTo(heap.get(currentRootNodeIndex)) > 0) {
8064
swap(currentRootNodeIndex, childIndexForSwap);
8165
if (childIndexForSwap == rightChildIndex) {
82-
maxHeapifyLeonardoTree(rightChildIndex, currentLeonardoLevel - 2);
66+
maxHeapifyTree(rightChildIndex, currentLevel - 2);
8367
} else { // swap happened with the left child
84-
maxHeapifyLeonardoTree(leftChildIndex, currentLeonardoLevel - 1);
68+
maxHeapifyTree(leftChildIndex, currentLevel - 1);
8569
}
8670
}
8771
}
8872

8973
private void shiftRootAndRestoreHeap() {
9074

91-
if (getHeapsize() == 0) {
75+
if (heap.size() == 0) {
9276
return;
9377
}
9478

95-
Integer[] currentLeonardoTreeLevels = findAllLeonardoTreeIndices();
79+
Integer[] currentTreeLevels = findAllTreeIndices();
9680
int previousTreeSizeCumulative = 0;
9781
ArrayList<Integer> rootNodeIndices = new ArrayList<Integer>();
9882

9983
// The number of roots are going to be same the the number of levels
100-
// iterate over the currentLeonardoTreeLevels and get roots
84+
// iterate over the currentTreeLevels and get roots
10185

102-
for (int i = 0; i < currentLeonardoTreeLevels.length; i++) {
103-
rootNodeIndices.add(previousTreeSizeCumulative + LeonardoNumber.leonardoNumber(currentLeonardoTreeLevels[i]) - 1);
104-
previousTreeSizeCumulative = previousTreeSizeCumulative + LeonardoNumber.leonardoNumber(currentLeonardoTreeLevels[i]);
86+
for (int i = 0; i < currentTreeLevels.length; i++) {
87+
rootNodeIndices.add(previousTreeSizeCumulative + LeonardoNumber.leonardoNumber(currentTreeLevels[i]) - 1);
88+
previousTreeSizeCumulative = previousTreeSizeCumulative + LeonardoNumber.leonardoNumber(currentTreeLevels[i]);
10589
}
10690

10791
int rootNodeIndexForHeapify = rootNodeIndices.getLast();
108-
int leonardoTreeLevelforHeapify = currentLeonardoTreeLevels[currentLeonardoTreeLevels.length - 1];
92+
int treeLevelforHeapify = currentTreeLevels[currentTreeLevels.length - 1];
10993
boolean swaped = false;
11094

11195
for (int i = 1; i < rootNodeIndices.size(); i++) {
11296

11397
int currentRootNodeIndex = rootNodeIndices.get(i);
11498
int prevRootNodeIndex = rootNodeIndices.get(i - 1);
11599
int j = i;
116-
while (leonardoHeap.get(prevRootNodeIndex).compareTo(leonardoHeap.get(currentRootNodeIndex)) > 0) {
117-
int currentLeonardoLevel = currentLeonardoTreeLevels[j];
118-
if (currentLeonardoLevel > 1) {
100+
while (heap.get(prevRootNodeIndex).compareTo(heap.get(currentRootNodeIndex)) > 0) {
101+
int currentLevel = currentTreeLevels[j];
102+
if (currentLevel > 1) {
119103
// compare child and swap
120104

121105
int indexOfRightChild = rootNodeIndices.get(j) - 1; // right child is of level n-2
122-
int indexOfLeftChild = rootNodeIndices.get(j) - 1 - LeonardoNumber.leonardoNumber(currentLeonardoLevel - 2);
123-
if (leonardoHeap.get(prevRootNodeIndex).compareTo(leonardoHeap.get(indexOfRightChild)) > 0 && leonardoHeap.get(prevRootNodeIndex).compareTo(leonardoHeap.get(indexOfLeftChild)) > 0) {
106+
int indexOfLeftChild = rootNodeIndices.get(j) - 1 - LeonardoNumber.leonardoNumber(currentLevel - 2);
107+
if (heap.get(prevRootNodeIndex).compareTo(heap.get(indexOfRightChild)) > 0 && heap.get(prevRootNodeIndex).compareTo(heap.get(indexOfLeftChild)) > 0) {
124108
swap(prevRootNodeIndex, currentRootNodeIndex);
125109
rootNodeIndexForHeapify = prevRootNodeIndex;
126-
leonardoTreeLevelforHeapify = currentLeonardoTreeLevels[j - 1];
110+
treeLevelforHeapify = currentTreeLevels[j - 1];
127111
swaped = true;
128112
} else {
129-
maxHeapifyLeonardoTree(currentRootNodeIndex, currentLeonardoLevel);
113+
maxHeapifyTree(currentRootNodeIndex, currentLevel);
130114
swaped = false;
131115
}
132116
} else {
133117
swap(prevRootNodeIndex, currentRootNodeIndex);
134118
rootNodeIndexForHeapify = prevRootNodeIndex;
135-
leonardoTreeLevelforHeapify = currentLeonardoTreeLevels[j - 1];
119+
treeLevelforHeapify = currentTreeLevels[j - 1];
136120
swaped = true;
137121
}
138122
j = j - 1;
@@ -146,17 +130,17 @@ private void shiftRootAndRestoreHeap() {
146130
}
147131

148132
if (swaped) {
149-
maxHeapifyLeonardoTree(rootNodeIndexForHeapify, leonardoTreeLevelforHeapify);
133+
maxHeapifyTree(rootNodeIndexForHeapify, treeLevelforHeapify);
150134
swaped = false;
151135
}
152136
}
153137

154-
maxHeapifyLeonardoTree(rootNodeIndexForHeapify, leonardoTreeLevelforHeapify); // In case of insert and no swap.
138+
maxHeapifyTree(rootNodeIndexForHeapify, treeLevelforHeapify); // In case of insert and no swap.
155139
}
156140

157141
private int getRightMostTree() {
158142
// Isolate the rightmost set bit
159-
int isolatedBit = leonardoLevelTracker & -leonardoLevelTracker;
143+
int isolatedBit = levelTracker & -levelTracker;
160144
int position = 0;
161145

162146
while (isolatedBit > 1) {
@@ -167,7 +151,7 @@ private int getRightMostTree() {
167151
return position;
168152
}
169153

170-
private static ArrayList<Integer> findConsecutiveLeonardoTreeIndices(int num) {
154+
private static ArrayList<Integer> findConsecutiveTreeIndices(int num) {
171155
int prevOneIndex = -1;
172156
int currentLevel;
173157

@@ -192,32 +176,30 @@ private static ArrayList<Integer> findConsecutiveLeonardoTreeIndices(int num) {
192176
}
193177

194178
private void swap(int i, int j) {
195-
T temp = leonardoHeap.get(i);
196-
leonardoHeap.set(i, leonardoHeap.get(j));
197-
leonardoHeap.set(j, temp);
179+
T temp = heap.get(i);
180+
heap.set(i, heap.get(j));
181+
heap.set(j, temp);
198182
}
199183

200-
private Integer[] findAllLeonardoTreeIndices() {
184+
private Integer[] findAllTreeIndices() {
201185
List<Integer> setBitIndexes = new ArrayList<>();
202186
for (int i = Integer.SIZE - 1; i >= 0; i--) {
203-
if ((leonardoLevelTracker & (1 << i)) != 0) {
187+
if ((levelTracker & (1 << i)) != 0) {
204188
setBitIndexes.add(i);
205189
}
206190
}
207191
return setBitIndexes.toArray(new Integer[0]);
208192
}
209193

210194
public void addElement(T element) {
211-
increaseLeonardoLevelTracker();
212-
leonardoHeap.add(element);
213-
increaseHeapSize();
195+
increaseLevelTracker();
196+
heap.add(element);
214197
shiftRootAndRestoreHeap();
215198
}
216199

217200
public T removeElement() {
218-
decreaseLeonardoLevelTracker();
219-
decreaseHeapSize();
220-
T element = leonardoHeap.removeLast();
201+
decreaseLevelTracker();
202+
T element = heap.removeLast();
221203
shiftRootAndRestoreHeap();
222204

223205
return element;

src/main/java/com/thealgorithms/sorts/SmoothSort.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,12 @@ public SmoothSort() {
1313
private static <T extends Comparable<T>> void smoothSort(T[] array) {
1414
LeonardoHeap<T> leonardoHeap = new LeonardoHeap<T>();
1515

16-
for (int i = 0; i < array.length; i++) {
17-
leonardoHeap.addElement(array[i]);
16+
for (final var element: array) {
17+
leonardoHeap.addElement(element);
1818
}
1919

2020
for (int i = 0; i < array.length; i++) {
21-
final T maxElement = leonardoHeap.removeElement();
22-
array[array.length - i - 1] = maxElement;
21+
array[array.length - i - 1] = leonardoHeap.removeElement();;
2322
}
2423
}
2524

0 commit comments

Comments
 (0)