-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmergeSortedArray.rb
116 lines (87 loc) · 1.74 KB
/
mergeSortedArray.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
class PriorityQueue
def initialize(elements = nil, &block)
@queue = []
@comparison = block || lambda{|a, b| a <=> b }
replace(elements) if elements
end
def replace(elements)
@queue.replace(elements)
sort!
self
end
def size
@queue.size
end
def clear
@queue.clear
end
def empty?
@queue.size <= 0
end
def pop
return nil if @queue.empty?
@queue.pop
end
def elements
@queue
end
def peek
return nil if empty?
@queue.last
end
def reheap(k)
return self if size <= 1
que = @queue.dup
v = que.delete_at(k)
i = binary_index(que, v)
que.insert(i, v)
@queue = que
return self
end
def binary_index(que, target)
upper = que.size - 1
lower = 0
while(upper >= lower) do
idx = lower + (upper - lower) / 2
comparison = @comparison.call(target, que[idx])
case comparison
when 0, nil
return idx
when 1, true
lower = idx + 1
when -1, false
upper = idx - 1
end
end
lower
end
def sort!
@queue.sort! do |a, b|
case @comparison.call(a, b)
when 0 , nil then 0
when 1, true then 1
when -1, false then -1
else
raise "invalid comparison value"
end
end
self
end
def push(v)
@queue << v
reheap(@queue.size - 1)
self
end
end
# Divive and Conquery (HeapSort)
def merge_k_sortedLists(lists, start = 0, stop = lists.size - 1)
return [] if lists.empty? || lists.count == 0
return lists[stop] if start == stop
minHeap = PriorityQueue.new
lists.each.with_index do |list, index|
list.each.with_index do |l, index|
minHeap.push(l)
end
end
return minHeap.elements
end