Skip to content

Commit 37c794b

Browse files
committed
Removed Helper Class, formatted to make items final.
1 parent 761b848 commit 37c794b

File tree

3 files changed

+57
-148
lines changed

3 files changed

+57
-148
lines changed

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

Lines changed: 57 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
package com.thealgorithms.datastructures.heaps;
22

3-
import com.thealgorithms.bitmanipulation.SingleBitOperations;
4-
import com.thealgorithms.maths.LeonardoNumber;
53
import java.util.ArrayList;
4+
import java.util.Collections;
65
import java.util.List;
76

7+
import com.thealgorithms.bitmanipulation.SingleBitOperations;
8+
import com.thealgorithms.maths.LeonardoNumber;
9+
810
/**
911
* Wikipedia: https://en.wikipedia.org/wiki/Smoothsort
1012
*/
@@ -17,7 +19,7 @@ public LeonardoHeap() {
1719
}
1820

1921
private void decreaseLevelTracker() {
20-
int lastTreeLevel = getRightMostTree();
22+
final int lastTreeLevel = getRightMostTree();
2123
levelTracker = SingleBitOperations.clearBit(levelTracker, lastTreeLevel);
2224
if (lastTreeLevel != 0 && lastTreeLevel != 1) {
2325
levelTracker = SingleBitOperations.setBit(levelTracker, lastTreeLevel - 1);
@@ -26,7 +28,7 @@ private void decreaseLevelTracker() {
2628
}
2729

2830
private void increaseLevelTracker() {
29-
ArrayList<Integer> consecutiveTreeIndices = LeonardoHeapHelper.findConsecutiveTreeIndices(levelTracker);
31+
final ArrayList<Integer> consecutiveTreeIndices = findConsecutiveTreeIndices(levelTracker);
3032
if (consecutiveTreeIndices.get(0) != -1) {
3133
// if 0th or 1st index is -1 that implies there are no concequtive trees
3234
levelTracker = SingleBitOperations.clearBit(levelTracker, consecutiveTreeIndices.get(0));
@@ -49,16 +51,10 @@ private void maxHeapifyTree(int rootNodeIndex, int currentLevel) {
4951
return; // Trees with one node are in already max-heapified.
5052
}
5153

52-
int currentRootNodeIndex = rootNodeIndex;
53-
int rightChildIndex = rootNodeIndex - 1;
54-
int leftChildIndex = rootNodeIndex - LeonardoNumber.leonardoNumber(currentLevel - 2) - 1;
55-
int childIndexForSwap = -1;
56-
57-
if (heap.get(rightChildIndex).compareTo(heap.get(leftChildIndex)) >= 0) {
58-
childIndexForSwap = rightChildIndex;
59-
} else {
60-
childIndexForSwap = leftChildIndex;
61-
}
54+
final int currentRootNodeIndex = rootNodeIndex;
55+
final int rightChildIndex = rootNodeIndex - 1;
56+
final int leftChildIndex = rootNodeIndex - LeonardoNumber.leonardoNumber(currentLevel - 2) - 1;
57+
final int childIndexForSwap = (heap.get(rightChildIndex).compareTo(heap.get(leftChildIndex)) >= 0) ? rightChildIndex : leftChildIndex;
6258

6359
if (heap.get(childIndexForSwap).compareTo(heap.get(currentRootNodeIndex)) > 0) {
6460
swap(currentRootNodeIndex, childIndexForSwap);
@@ -76,7 +72,7 @@ private void shiftRootAndRestoreHeap() {
7672
return;
7773
}
7874

79-
Integer[] currentTreeLevels = LeonardoHeapHelper.findAllTreeIndices(levelTracker);
75+
final Integer[] currentTreeLevels = findAllTreeIndices(levelTracker);
8076
int previousTreeSizeCumulative = 0;
8177
ArrayList<Integer> rootNodeIndices = new ArrayList<Integer>();
8278

@@ -90,34 +86,35 @@ private void shiftRootAndRestoreHeap() {
9086

9187
int rootNodeIndexForHeapify = rootNodeIndices.getLast();
9288
int treeLevelforHeapify = currentTreeLevels[currentTreeLevels.length - 1];
93-
boolean swaped = false;
9489

9590
for (int i = 1; i < rootNodeIndices.size(); i++) {
9691

9792
int currentRootNodeIndex = rootNodeIndices.get(i);
9893
int prevRootNodeIndex = rootNodeIndices.get(i - 1);
9994
int j = i;
95+
boolean swapped = false;
96+
10097
while (heap.get(prevRootNodeIndex).compareTo(heap.get(currentRootNodeIndex)) > 0) {
101-
int currentLevel = currentTreeLevels[j];
98+
final int currentLevel = currentTreeLevels[j];
10299
if (currentLevel > 1) {
103100
// compare child and swap
104101

105-
int indexOfRightChild = rootNodeIndices.get(j) - 1; // right child is of level n-2
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) {
102+
final int rightChildIndex = rootNodeIndices.get(j) - 1; // right child is of level n-2
103+
final int leftChildIndex = rootNodeIndices.get(j) - 1 - LeonardoNumber.leonardoNumber(currentLevel - 2);
104+
if (heap.get(prevRootNodeIndex).compareTo(heap.get(rightChildIndex)) > 0 && heap.get(prevRootNodeIndex).compareTo(heap.get(leftChildIndex)) > 0) {
108105
swap(prevRootNodeIndex, currentRootNodeIndex);
109106
rootNodeIndexForHeapify = prevRootNodeIndex;
110107
treeLevelforHeapify = currentTreeLevels[j - 1];
111-
swaped = true;
108+
swapped = true;
112109
} else {
113110
maxHeapifyTree(currentRootNodeIndex, currentLevel);
114-
swaped = false;
111+
swapped = false;
115112
}
116113
} else {
117114
swap(prevRootNodeIndex, currentRootNodeIndex);
118115
rootNodeIndexForHeapify = prevRootNodeIndex;
119116
treeLevelforHeapify = currentTreeLevels[j - 1];
120-
swaped = true;
117+
swapped = true;
121118
}
122119
j = j - 1;
123120
if (j > 0) {
@@ -129,9 +126,8 @@ private void shiftRootAndRestoreHeap() {
129126
}
130127
}
131128

132-
if (swaped) {
129+
if (swapped) {
133130
maxHeapifyTree(rootNodeIndexForHeapify, treeLevelforHeapify);
134-
swaped = false;
135131
}
136132
}
137133

@@ -152,9 +148,7 @@ private int getRightMostTree() {
152148
}
153149

154150
private void swap(int i, int j) {
155-
T temp = heap.get(i);
156-
heap.set(i, heap.get(j));
157-
heap.set(j, temp);
151+
Collections.swap(heap, i, j);
158152
}
159153

160154
public void addElement(T element) {
@@ -165,9 +159,43 @@ public void addElement(T element) {
165159

166160
public T removeElement() {
167161
decreaseLevelTracker();
168-
T element = heap.removeLast();
162+
final T element = heap.removeLast();
169163
shiftRootAndRestoreHeap();
170164

171165
return element;
172166
}
167+
168+
private static ArrayList<Integer> findConsecutiveTreeIndices(int num) {
169+
int prevOneIndex = -1;
170+
int currentLevel = 0;
171+
172+
ArrayList<Integer> answer = new ArrayList<Integer>();
173+
answer.add(-1);
174+
answer.add(-1);
175+
176+
for (int i = 0; num > 0; i++) {
177+
currentLevel = num & 1;
178+
if (currentLevel == 1) {
179+
if (prevOneIndex != -1) {
180+
answer.set(0, prevOneIndex);
181+
answer.set(1, i);
182+
}
183+
prevOneIndex = i;
184+
} else {
185+
prevOneIndex = -1;
186+
}
187+
num >>>= 1;
188+
}
189+
return answer;
190+
}
191+
192+
private static Integer[] findAllTreeIndices(int num) {
193+
List<Integer> setBitIndexes = new ArrayList<>();
194+
for (int i = Integer.SIZE - 1; i >= 0; i--) {
195+
if ((num & (1 << i)) != 0) {
196+
setBitIndexes.add(i);
197+
}
198+
}
199+
return setBitIndexes.toArray(new Integer[0]);
200+
}
173201
}

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

Lines changed: 0 additions & 45 deletions
This file was deleted.

src/test/java/com/thealgorithms/datastructures/heaps/LeonardoHeapHelperTest.java

Lines changed: 0 additions & 74 deletions
This file was deleted.

0 commit comments

Comments
 (0)