parent
82f7a6c75a
commit
7ea496ba09
|
@ -58,4 +58,31 @@ public class MinHeap {
|
||||||
heapNodes[i] = heapNodes[j];
|
heapNodes[i] = heapNodes[j];
|
||||||
heapNodes[j] = temp;
|
heapNodes[j] = temp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int[] merge(int[][] array) {
|
||||||
|
HeapNode[] heapNodes = new HeapNode[array.length];
|
||||||
|
int resultingArraySize = 0;
|
||||||
|
|
||||||
|
for (int i = 0; i < array.length; i++) {
|
||||||
|
HeapNode node = new HeapNode(array[i][0], i);
|
||||||
|
heapNodes[i] = node;
|
||||||
|
resultingArraySize += array[i].length;
|
||||||
|
}
|
||||||
|
|
||||||
|
MinHeap minHeap = new MinHeap(heapNodes);
|
||||||
|
int[] resultingArray = new int[resultingArraySize];
|
||||||
|
|
||||||
|
for (int i = 0; i < resultingArraySize; i++) {
|
||||||
|
HeapNode root = minHeap.getRootNode();
|
||||||
|
resultingArray[i] = root.element;
|
||||||
|
|
||||||
|
if (root.nextElementIndex < array[root.arrayIndex].length) {
|
||||||
|
root.element = array[root.arrayIndex][root.nextElementIndex++];
|
||||||
|
} else {
|
||||||
|
root.element = Integer.MAX_VALUE;
|
||||||
|
}
|
||||||
|
minHeap.heapifyFromRoot();
|
||||||
|
}
|
||||||
|
return resultingArray;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,40 +0,0 @@
|
||||||
package com.baeldung.algorithms.minheapmerge;
|
|
||||||
|
|
||||||
public class MinHeapMerge {
|
|
||||||
|
|
||||||
static int populateHeapNodesAndDetermineResultingArrayLength(int[][] array, HeapNode[] heapNodes) {
|
|
||||||
int resultSize = 0;
|
|
||||||
|
|
||||||
for (int i = 0; i < array.length; i++) {
|
|
||||||
HeapNode node = new HeapNode(array[i][0], i);
|
|
||||||
heapNodes[i] = node;
|
|
||||||
resultSize += array[i].length;
|
|
||||||
}
|
|
||||||
return resultSize;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int[] createMinHeapAndMergeArrays(int[][] array, HeapNode[] heapNodes, int resultingArraySize) {
|
|
||||||
|
|
||||||
MinHeap minHeap = new MinHeap(heapNodes);
|
|
||||||
int[] resultingArray = new int[resultingArraySize];
|
|
||||||
|
|
||||||
for (int i = 0; i < resultingArraySize; i++) {
|
|
||||||
HeapNode root = minHeap.getRootNode();
|
|
||||||
resultingArray[i] = root.element;
|
|
||||||
|
|
||||||
if (root.nextElementIndex < array[root.arrayIndex].length) {
|
|
||||||
root.element = array[root.arrayIndex][root.nextElementIndex++];
|
|
||||||
} else {
|
|
||||||
root.element = Integer.MAX_VALUE;
|
|
||||||
}
|
|
||||||
minHeap.heapifyFromRoot();
|
|
||||||
}
|
|
||||||
return resultingArray;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int[] merge(int[][] array) {
|
|
||||||
HeapNode[] heapNodes = new HeapNode[array.length];
|
|
||||||
int resultingArraySize = populateHeapNodesAndDetermineResultingArrayLength(array, heapNodes);
|
|
||||||
return createMinHeapAndMergeArrays(array, heapNodes, resultingArraySize);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,39 +0,0 @@
|
||||||
package com.baeldung.algorithms.minheapmerge;
|
|
||||||
|
|
||||||
import static org.hamcrest.CoreMatchers.equalTo;
|
|
||||||
import static org.hamcrest.CoreMatchers.is;
|
|
||||||
import static org.junit.Assert.assertThat;
|
|
||||||
|
|
||||||
import org.junit.Test;
|
|
||||||
|
|
||||||
public class MinHeapMergeUnitTest {
|
|
||||||
|
|
||||||
private final int[][] inputArray = { { 0, 6 }, { 1, 5, 10, 100 }, { 2, 4, 200, 650 } };
|
|
||||||
private final int[] expectedArray = { 0, 1, 2, 4, 5, 6, 10, 100, 200, 650 };
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void givenSortedArrays_whenMerged_thenShouldReturnASingleSortedarray() {
|
|
||||||
int[] resultArray = MinHeapMerge.merge(inputArray);
|
|
||||||
|
|
||||||
assertThat(resultArray.length, is(equalTo(10)));
|
|
||||||
assertThat(resultArray, is(equalTo(expectedArray)));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void givenEmptyHeapNodesAndInputArray_whenPopulated_thenShouldPopulateAndReturnResultArrayLength() {
|
|
||||||
int size = MinHeapMerge.populateHeapNodesAndDetermineResultingArrayLength(inputArray, new HeapNode[inputArray.length]);
|
|
||||||
|
|
||||||
assertThat(size, is(equalTo(10)));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void givenArrayAndHeapNodesAndResultArraySize_whenMerged_thenShouldReturnASingleSortedarray() {
|
|
||||||
HeapNode[] heapNodes = new HeapNode[inputArray.length];
|
|
||||||
int size = MinHeapMerge.populateHeapNodesAndDetermineResultingArrayLength(inputArray, heapNodes);
|
|
||||||
|
|
||||||
int[] resultArray = MinHeapMerge.createMinHeapAndMergeArrays(inputArray, heapNodes, size);
|
|
||||||
|
|
||||||
assertThat(resultArray.length, is(equalTo(10)));
|
|
||||||
assertThat(resultArray, is(equalTo(expectedArray)));
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -0,0 +1,22 @@
|
||||||
|
package com.baeldung.algorithms.minheapmerge;
|
||||||
|
|
||||||
|
import static org.hamcrest.CoreMatchers.equalTo;
|
||||||
|
import static org.hamcrest.CoreMatchers.is;
|
||||||
|
import static org.junit.Assert.assertThat;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
public class MinHeapUnitTest {
|
||||||
|
|
||||||
|
private final int[][] inputArray = { { 0, 6 }, { 1, 5, 10, 100 }, { 2, 4, 200, 650 } };
|
||||||
|
private final int[] expectedArray = { 0, 1, 2, 4, 5, 6, 10, 100, 200, 650 };
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenSortedArrays_whenMerged_thenShouldReturnASingleSortedarray() {
|
||||||
|
int[] resultArray = MinHeap.merge(inputArray);
|
||||||
|
|
||||||
|
assertThat(resultArray.length, is(equalTo(10)));
|
||||||
|
assertThat(resultArray, is(equalTo(expectedArray)));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue