Skip to content

Commit 1109d0b

Browse files
author
mikr
committed
Java-1520 Split or move algorithms-miscellaneous-5 module
1 parent be66243 commit 1109d0b

24 files changed

+160
-139
lines changed

algorithms-miscellaneous-5/README.md

+2-6
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,5 @@ This module contains articles about algorithms. Some classes of algorithms, e.g.
1515
- [Maximum Subarray Problem](https://www.baeldung.com/java-maximum-subarray)
1616
- [How to Merge Two Sorted Arrays](https://www.baeldung.com/java-merge-sorted-arrays)
1717
- [Median of Stream of Integers using Heap](https://www.baeldung.com/java-stream-integers-median-using-heap)
18-
- [Kruskal’s Algorithm for Spanning Trees](https://www.baeldung.com/java-spanning-trees-kruskal)
19-
- [Balanced Brackets Algorithm in Java](https://www.baeldung.com/java-balanced-brackets-algorithm)
20-
- [Efficiently Merge Sorted Java Sequences](https://www.baeldung.com/java-merge-sorted-sequences)
21-
- [Introduction to Greedy Algorithms with Java](https://www.baeldung.com/java-greedy-algorithms)
22-
- [The Caesar Cipher in Java](https://www.baeldung.com/java-caesar-cipher)
23-
- More articles: [[<-- prev]](/../algorithms-miscellaneous-4)
18+
- More articles: [[<-- prev]](/../algorithms-miscellaneous-4) [[next -->]](/../algorithms-miscellaneous-6)
19+

algorithms-miscellaneous-5/pom.xml

+4-10
Original file line numberDiff line numberDiff line change
@@ -21,16 +21,10 @@
2121
<version>${commons-codec.version}</version>
2222
</dependency>
2323
<dependency>
24-
<groupId>org.apache.commons</groupId>
25-
<artifactId>commons-math3</artifactId>
26-
<version>${commons-math3.version}</version>
27-
</dependency>
28-
<dependency>
29-
<groupId>org.projectlombok</groupId>
30-
<artifactId>lombok</artifactId>
31-
<version>${lombok.version}</version>
32-
<scope>provided</scope>
33-
</dependency>
24+
<groupId>org.apache.commons</groupId>
25+
<artifactId>commons-math3</artifactId>
26+
<version>${commons-math3.version}</version>
27+
</dependency>
3428
<dependency>
3529
<groupId>pl.allegro.finance</groupId>
3630
<artifactId>tradukisto</artifactId>

algorithms-miscellaneous-6/README.md

+6
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,9 @@
22

33
- [Boruvka’s Algorithm for Minimum Spanning Trees](https://www.baeldung.com/java-boruvka-algorithm)
44
- [Gradient Descent in Java](https://www.baeldung.com/java-gradient-descent)
5+
- [Kruskal’s Algorithm for Spanning Trees](https://www.baeldung.com/java-spanning-trees-kruskal)
6+
- [Balanced Brackets Algorithm in Java](https://www.baeldung.com/java-balanced-brackets-algorithm)
7+
- [Efficiently Merge Sorted Java Sequences](https://www.baeldung.com/java-merge-sorted-sequences)
8+
- [Introduction to Greedy Algorithms with Java](https://www.baeldung.com/java-greedy-algorithms)
9+
- [The Caesar Cipher in Java](https://www.baeldung.com/java-caesar-cipher)
10+
- More articles: [[<-- prev]](/../algorithms-miscellaneous-5)

algorithms-miscellaneous-6/pom.xml

+25
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,35 @@
1818
<artifactId>guava</artifactId>
1919
<version>${guava.version}</version>
2020
</dependency>
21+
<dependency>
22+
<groupId>org.junit.platform</groupId>
23+
<artifactId>junit-platform-commons</artifactId>
24+
<version>${junit.platform.version}</version>
25+
</dependency>
26+
<dependency>
27+
<groupId>org.assertj</groupId>
28+
<artifactId>assertj-core</artifactId>
29+
<version>${org.assertj.core.version}</version>
30+
<scope>test</scope>
31+
</dependency>
32+
<dependency>
33+
<groupId>org.projectlombok</groupId>
34+
<artifactId>lombok</artifactId>
35+
<version>${lombok.version}</version>
36+
<scope>provided</scope>
37+
</dependency>
38+
<dependency>
39+
<groupId>org.apache.commons</groupId>
40+
<artifactId>commons-math3</artifactId>
41+
<version>${commons-math3.version}</version>
42+
</dependency>
2143
</dependencies>
2244

2345
<properties>
2446
<guava.version>28.1-jre</guava.version>
47+
<org.assertj.core.version>3.9.0</org.assertj.core.version>
48+
<junit.platform.version>1.6.0</junit.platform.version>
49+
<commons-math3.version>3.6.1</commons-math3.version>
2550
</properties>
2651

2752
</project>
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
1-
package com.baeldung.algorithms.minheapmerge;
2-
3-
public class HeapNode {
4-
5-
int element;
6-
int arrayIndex;
7-
int nextElementIndex = 1;
8-
9-
public HeapNode(int element, int arrayIndex) {
10-
this.element = element;
11-
this.arrayIndex = arrayIndex;
12-
}
13-
}
1+
package com.baeldung.algorithms.minheapmerge;
2+
3+
public class HeapNode {
4+
5+
int element;
6+
int arrayIndex;
7+
int nextElementIndex = 1;
8+
9+
public HeapNode(int element, int arrayIndex) {
10+
this.element = element;
11+
this.arrayIndex = arrayIndex;
12+
}
13+
}
Original file line numberDiff line numberDiff line change
@@ -1,88 +1,88 @@
1-
package com.baeldung.algorithms.minheapmerge;
2-
3-
public class MinHeap {
4-
5-
HeapNode[] heapNodes;
6-
7-
public MinHeap(HeapNode heapNodes[]) {
8-
this.heapNodes = heapNodes;
9-
heapifyFromLastLeafsParent();
10-
}
11-
12-
void heapifyFromLastLeafsParent() {
13-
int lastLeafsParentIndex = getParentNodeIndex(heapNodes.length);
14-
while (lastLeafsParentIndex >= 0) {
15-
heapify(lastLeafsParentIndex);
16-
lastLeafsParentIndex--;
17-
}
18-
}
19-
20-
void heapify(int index) {
21-
int leftNodeIndex = getLeftNodeIndex(index);
22-
int rightNodeIndex = getRightNodeIndex(index);
23-
int smallestElementIndex = index;
24-
if (leftNodeIndex < heapNodes.length && heapNodes[leftNodeIndex].element < heapNodes[index].element) {
25-
smallestElementIndex = leftNodeIndex;
26-
}
27-
if (rightNodeIndex < heapNodes.length && heapNodes[rightNodeIndex].element < heapNodes[smallestElementIndex].element) {
28-
smallestElementIndex = rightNodeIndex;
29-
}
30-
if (smallestElementIndex != index) {
31-
swap(index, smallestElementIndex);
32-
heapify(smallestElementIndex);
33-
}
34-
}
35-
36-
int getParentNodeIndex(int index) {
37-
return (index - 1) / 2;
38-
}
39-
40-
int getLeftNodeIndex(int index) {
41-
return (2 * index + 1);
42-
}
43-
44-
int getRightNodeIndex(int index) {
45-
return (2 * index + 2);
46-
}
47-
48-
HeapNode getRootNode() {
49-
return heapNodes[0];
50-
}
51-
52-
void heapifyFromRoot() {
53-
heapify(0);
54-
}
55-
56-
void swap(int i, int j) {
57-
HeapNode temp = heapNodes[i];
58-
heapNodes[i] = heapNodes[j];
59-
heapNodes[j] = temp;
60-
}
61-
62-
static int[] merge(int[][] array) {
63-
HeapNode[] heapNodes = new HeapNode[array.length];
64-
int resultingArraySize = 0;
65-
66-
for (int i = 0; i < array.length; i++) {
67-
HeapNode node = new HeapNode(array[i][0], i);
68-
heapNodes[i] = node;
69-
resultingArraySize += array[i].length;
70-
}
71-
72-
MinHeap minHeap = new MinHeap(heapNodes);
73-
int[] resultingArray = new int[resultingArraySize];
74-
75-
for (int i = 0; i < resultingArraySize; i++) {
76-
HeapNode root = minHeap.getRootNode();
77-
resultingArray[i] = root.element;
78-
79-
if (root.nextElementIndex < array[root.arrayIndex].length) {
80-
root.element = array[root.arrayIndex][root.nextElementIndex++];
81-
} else {
82-
root.element = Integer.MAX_VALUE;
83-
}
84-
minHeap.heapifyFromRoot();
85-
}
86-
return resultingArray;
87-
}
88-
}
1+
package com.baeldung.algorithms.minheapmerge;
2+
3+
public class MinHeap {
4+
5+
HeapNode[] heapNodes;
6+
7+
public MinHeap(HeapNode heapNodes[]) {
8+
this.heapNodes = heapNodes;
9+
heapifyFromLastLeafsParent();
10+
}
11+
12+
void heapifyFromLastLeafsParent() {
13+
int lastLeafsParentIndex = getParentNodeIndex(heapNodes.length);
14+
while (lastLeafsParentIndex >= 0) {
15+
heapify(lastLeafsParentIndex);
16+
lastLeafsParentIndex--;
17+
}
18+
}
19+
20+
void heapify(int index) {
21+
int leftNodeIndex = getLeftNodeIndex(index);
22+
int rightNodeIndex = getRightNodeIndex(index);
23+
int smallestElementIndex = index;
24+
if (leftNodeIndex < heapNodes.length && heapNodes[leftNodeIndex].element < heapNodes[index].element) {
25+
smallestElementIndex = leftNodeIndex;
26+
}
27+
if (rightNodeIndex < heapNodes.length && heapNodes[rightNodeIndex].element < heapNodes[smallestElementIndex].element) {
28+
smallestElementIndex = rightNodeIndex;
29+
}
30+
if (smallestElementIndex != index) {
31+
swap(index, smallestElementIndex);
32+
heapify(smallestElementIndex);
33+
}
34+
}
35+
36+
int getParentNodeIndex(int index) {
37+
return (index - 1) / 2;
38+
}
39+
40+
int getLeftNodeIndex(int index) {
41+
return (2 * index + 1);
42+
}
43+
44+
int getRightNodeIndex(int index) {
45+
return (2 * index + 2);
46+
}
47+
48+
HeapNode getRootNode() {
49+
return heapNodes[0];
50+
}
51+
52+
void heapifyFromRoot() {
53+
heapify(0);
54+
}
55+
56+
void swap(int i, int j) {
57+
HeapNode temp = heapNodes[i];
58+
heapNodes[i] = heapNodes[j];
59+
heapNodes[j] = temp;
60+
}
61+
62+
static int[] merge(int[][] array) {
63+
HeapNode[] heapNodes = new HeapNode[array.length];
64+
int resultingArraySize = 0;
65+
66+
for (int i = 0; i < array.length; i++) {
67+
HeapNode node = new HeapNode(array[i][0], i);
68+
heapNodes[i] = node;
69+
resultingArraySize += array[i].length;
70+
}
71+
72+
MinHeap minHeap = new MinHeap(heapNodes);
73+
int[] resultingArray = new int[resultingArraySize];
74+
75+
for (int i = 0; i < resultingArraySize; i++) {
76+
HeapNode root = minHeap.getRootNode();
77+
resultingArray[i] = root.element;
78+
79+
if (root.nextElementIndex < array[root.arrayIndex].length) {
80+
root.element = array[root.arrayIndex][root.nextElementIndex++];
81+
} else {
82+
root.element = Integer.MAX_VALUE;
83+
}
84+
minHeap.heapifyFromRoot();
85+
}
86+
return resultingArray;
87+
}
88+
}
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,22 @@
1-
package com.baeldung.algorithms.minheapmerge;
2-
3-
import static org.hamcrest.CoreMatchers.equalTo;
4-
import static org.hamcrest.CoreMatchers.is;
5-
import static org.junit.Assert.assertThat;
6-
7-
import org.junit.Test;
8-
9-
public class MinHeapUnitTest {
10-
11-
private final int[][] inputArray = { { 0, 6 }, { 1, 5, 10, 100 }, { 2, 4, 200, 650 } };
12-
private final int[] expectedArray = { 0, 1, 2, 4, 5, 6, 10, 100, 200, 650 };
13-
14-
@Test
15-
public void givenSortedArrays_whenMerged_thenShouldReturnASingleSortedarray() {
16-
int[] resultArray = MinHeap.merge(inputArray);
17-
18-
assertThat(resultArray.length, is(equalTo(10)));
19-
assertThat(resultArray, is(equalTo(expectedArray)));
20-
}
21-
22-
}
1+
package com.baeldung.algorithms.minheapmerge;
2+
3+
import static org.hamcrest.CoreMatchers.equalTo;
4+
import static org.hamcrest.CoreMatchers.is;
5+
import static org.junit.Assert.assertThat;
6+
7+
import org.junit.Test;
8+
9+
public class MinHeapUnitTest {
10+
11+
private final int[][] inputArray = { { 0, 6 }, { 1, 5, 10, 100 }, { 2, 4, 200, 650 } };
12+
private final int[] expectedArray = { 0, 1, 2, 4, 5, 6, 10, 100, 200, 650 };
13+
14+
@Test
15+
public void givenSortedArrays_whenMerged_thenShouldReturnASingleSortedarray() {
16+
int[] resultArray = MinHeap.merge(inputArray);
17+
18+
assertThat(resultArray.length, is(equalTo(10)));
19+
assertThat(resultArray, is(equalTo(expectedArray)));
20+
}
21+
22+
}

0 commit comments

Comments
 (0)