Skip to content

Commit de9a25b

Browse files
committed
merge k-way sorted array
1 parent 74438f0 commit de9a25b

2 files changed

Lines changed: 150 additions & 1 deletion

File tree

Lines changed: 149 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,149 @@
1+
import java.util.ArrayList;
2+
import java.util.Arrays;
3+
import java.util.Queue;
4+
import java.util.LinkedList;
5+
6+
/**
7+
* merge K sorted arrays into one. total: N
8+
* min heap: O(NlgK)
9+
*/
10+
public class MergeSortedArray {
11+
12+
private static class ArrayNode {
13+
public Integer value;
14+
public int arrayIndex;
15+
16+
public ArrayNode(Integer v, int index) {
17+
value = v;
18+
arrayIndex = index;
19+
}
20+
public String toString(){
21+
return String.valueOf(value);
22+
}
23+
} // end of ArrayNode
24+
25+
private static class MinHeapArrayNode {
26+
private ArrayList<ArrayNode> heap;
27+
28+
public MinHeapArrayNode() {
29+
heap = new ArrayList<ArrayNode>();
30+
// 1 is the min one.
31+
// it is easy to calculate left, right and parent
32+
heap.add(null);
33+
34+
}
35+
36+
public void insert(ArrayNode node) {
37+
heap.add(node);
38+
shiftUp(heap.size() - 1);
39+
}
40+
41+
public ArrayNode removeMin() {
42+
if (isEmpty())
43+
throw new RuntimeException("heap is empty");
44+
ArrayNode min = heap.get(1);
45+
heap.remove(min);
46+
47+
if(heap.size() != 1){
48+
shiftDown(1);
49+
}
50+
return min;
51+
}
52+
53+
private void shiftUp(int k) {
54+
//k/2 parent
55+
while (k > 1 && greater(k / 2, k)) {
56+
swap(k / 2, k);
57+
k = k / 2;
58+
}
59+
}
60+
61+
private void shiftDown(int k) {
62+
while (2 * k <= heap.size() - 1) {
63+
int i = 2 * k; //left
64+
int j = i + 1; //right
65+
if (i < heap.size() - 1 && greater(j, i)) {
66+
i++;
67+
}
68+
if (greater(i, k)) break;
69+
swap(i, k);
70+
k = i;
71+
}
72+
}
73+
74+
private boolean greater(int i, int j) {
75+
76+
if (i > 0 && j < heap.size()) {
77+
return heap.get(i).value > heap.get(j).value;
78+
}
79+
return false;
80+
}
81+
82+
private void swap(int i, int j) {
83+
ArrayNode tmp = heap.get(i);
84+
heap.set(i, heap.get(j));
85+
heap.set(j, tmp);
86+
}
87+
88+
private boolean isEmpty() {
89+
return heap.size() == 1;
90+
}
91+
92+
93+
} // end of MinHeapArrayNode
94+
95+
public static void main(String[] args) {
96+
Integer[][] arrays = new Integer[][]{
97+
{1, 5, 9},
98+
{4, 8, 10},
99+
{6, 11}
100+
};
101+
102+
ArrayList<Integer> result = mergeSortedArray(arrays);
103+
System.out.println(result.toString());
104+
}
105+
106+
public static ArrayList<Integer> mergeSortedArray(Integer[][] arrays) {
107+
ArrayList<Integer> result = new ArrayList<Integer>();
108+
ArrayList<Queue<Integer>> lists = new ArrayList<Queue<Integer>>();
109+
110+
for (int i = 0; i < arrays.length; i++) {
111+
ArrayList<Integer> tmpArray = new ArrayList<Integer>(Arrays.asList(arrays[i]));
112+
Queue<Integer> tmpQueue = new LinkedList<Integer>(tmpArray);
113+
lists.add(tmpQueue);
114+
}
115+
116+
MinHeapArrayNode heap = new MinHeapArrayNode();
117+
118+
// initialize minheap
119+
for (int i = 0; i < lists.size(); i++) {
120+
heap.insert(new ArrayNode(lists.get(i).poll(), i));
121+
}
122+
123+
boolean done = false;
124+
while (!done) {
125+
126+
ArrayNode minNode = heap.removeMin();
127+
result.add(minNode.value);
128+
int nextIndex = minNode.arrayIndex;
129+
130+
Queue<Integer> nextQueue = lists.get(nextIndex);
131+
while (nextQueue.size() == 0) {
132+
nextIndex = (nextIndex < lists.size() - 1) ? nextIndex + 1 : 0;
133+
nextQueue = lists.get(nextIndex);
134+
if (nextIndex == minNode.arrayIndex) {
135+
done = true;
136+
break;
137+
}
138+
}
139+
140+
if(!done)
141+
heap.insert(new ArrayNode(nextQueue.poll(), minNode.arrayIndex));
142+
143+
}
144+
while(!heap.isEmpty())
145+
result.add(heap.removeMin().value);
146+
147+
return result;
148+
}
149+
}

‎PuzzleCoding/src/MinHeap.java‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ public MinHeap(int max) {
1313
}
1414

1515
public void insert(int value) {
16-
if (current == heap.length - 1) {
16+
if (current == maxSize) {
1717
throw new RuntimeException("Heap is full!");
1818
}
1919
heap[++current] = value;

0 commit comments

Comments
 (0)