Skip to content

Commit 979d612

Browse files
committed
task2 solution
1 parent da431aa commit 979d612

File tree

2 files changed

+56
-156
lines changed

2 files changed

+56
-156
lines changed
Lines changed: 39 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -1,82 +1,39 @@
1-
# def merge_sort(array, start: nil, finish: nil, buffer: nil)
2-
# return if start == finish
3-
4-
# mid = (finish - start) / 2 + start
5-
6-
# merge_sort(array, start: start, finish: mid, buffer: buffer)
7-
# merge_sort(array, start: mid + 1, finish: finish, buffer: buffer)
8-
9-
# i = 0
10-
# j = 0
11-
# b = 0
12-
# loop do
13-
# remaining = (j + mid + 1)..finish if i == mid + 1 - start
14-
# remaining = (i + start)..mid if j == finish - mid
15-
# if remaining
16-
# remaining.each do |k|
17-
# buffer[b] = array[k]
18-
# b += 1
19-
# end
20-
# break
21-
# end
22-
# x = array[i + start]
23-
# y = array[j + mid + 1]
24-
# if x < y
25-
# buffer[b] = x
26-
# i += 1
27-
# else
28-
# buffer[b] = y
29-
# j += 1
30-
# end
31-
# b += 1
32-
# end
33-
# (0...b).each do |k|
34-
# array[start + k] = buffer[k]
35-
# end
36-
37-
# array
38-
# end
39-
40-
# n = 10
41-
# a = n.times.map { rand(0..99) }.sort + n.times.map { rand(0..99) }.sort
42-
# b = Array.new(n)
43-
44-
# p a
45-
46-
# k = 0
47-
# i = 0
48-
# j = n
49-
50-
# while k < n do
51-
# if a[i] <= a[j]
52-
# b[k] = a[i]
53-
# a[i] = nil
54-
# i += 1
55-
# else
56-
# b[k] = a[j]
57-
# a[j] = nil
58-
# j += 1
59-
# end
60-
# k += 1
61-
# end
62-
63-
# i = 2 * n - 1
64-
# k = 2 * n - 1
65-
# while k >= n do
66-
# if a[i]
67-
# a[k] = a[i] unless k == i
68-
# k -= 1
69-
# end
70-
# i -= 1
71-
# end
72-
73-
# b.each_with_index do |e, i|
74-
# a[i] = e
75-
# end
76-
77-
# merge_sort(a, start: n, finish: 2*n - 1, buffer: b)
78-
79-
# p b
80-
# p a
81-
# p a.sort
82-
# p a == a.sort
1+
def kth(array1, array2, k)
2+
return kth(array2, array1, k) if array1.size > array2.size
3+
return array2[k] if array1.empty?
4+
return [array1[0], array2[0]].min if k == 0
5+
6+
low = [0, k - array2.size].max
7+
high = [k, array1.size ].min
8+
9+
while low <= high
10+
partition1 = (low + high) / 2
11+
partition2 = k - partition1
12+
13+
max_left_1 = partition1 > 0 ? array1[partition1 - 1] : Float::NEGATIVE_INFINITY
14+
max_left_2 = partition2 > 0 ? array2[partition2 - 1] : Float::NEGATIVE_INFINITY
15+
min_right_1 = partition1 < array1.size ? array1[partition1] : Float::INFINITY
16+
min_right_2 = partition2 < array2.size ? array2[partition2] : Float::INFINITY
17+
18+
if max_left_1 <= min_right_2 && max_left_2 <= min_right_1
19+
return [min_right_1, min_right_2].min
20+
elsif max_left_1 > min_right_2
21+
high = partition1 - 1
22+
else
23+
low = partition1 + 1
24+
end
25+
end
26+
end
27+
28+
# Given two sorted arrays `a[]` and `b[]`, of lengths `n1` and `n2` and an integer `0 ≤ k < n1 + n2`
29+
n = 10
30+
n1 = n
31+
n2 = n
32+
33+
a = n1.times.map { rand(10..99) }.sort
34+
b = n2.times.map { rand(10..99) }.sort
35+
k = rand(0...(n1 + n2))
36+
37+
c = (a + b).sort
38+
39+
p kth(a, b, k) == c[k]
Lines changed: 17 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -1,82 +1,25 @@
1-
# def merge_sort(array, start: nil, finish: nil, buffer: nil)
2-
# return if start == finish
31

4-
# mid = (finish - start) / 2 + start
52

6-
# merge_sort(array, start: start, finish: mid, buffer: buffer)
7-
# merge_sort(array, start: mid + 1, finish: finish, buffer: buffer)
83

9-
# i = 0
10-
# j = 0
11-
# b = 0
12-
# loop do
13-
# remaining = (j + mid + 1)..finish if i == mid + 1 - start
14-
# remaining = (i + start)..mid if j == finish - mid
15-
# if remaining
16-
# remaining.each do |k|
17-
# buffer[b] = array[k]
18-
# b += 1
19-
# end
20-
# break
21-
# end
22-
# x = array[i + start]
23-
# y = array[j + mid + 1]
24-
# if x < y
25-
# buffer[b] = x
26-
# i += 1
27-
# else
28-
# buffer[b] = y
29-
# j += 1
30-
# end
31-
# b += 1
32-
# end
33-
# (0...b).each do |k|
34-
# array[start + k] = buffer[k]
35-
# end
364

37-
# array
38-
# end
395

40-
# n = 10
41-
# a = n.times.map { rand(0..99) }.sort + n.times.map { rand(0..99) }.sort
42-
# b = Array.new(n)
436

44-
# p a
7+
----------------------------------
458

46-
# k = 0
47-
# i = 0
48-
# j = n
9+
Hint: determine the
10+
(
11+
12+
/
13+
10
14+
)
15+
16+
17+
(n/10)
18+
th
19+
largest key using quickselect and check if it occurs more than
20+
21+
/
22+
10
23+
n/10 times.
4924

50-
# while k < n do
51-
# if a[i] <= a[j]
52-
# b[k] = a[i]
53-
# a[i] = nil
54-
# i += 1
55-
# else
56-
# b[k] = a[j]
57-
# a[j] = nil
58-
# j += 1
59-
# end
60-
# k += 1
61-
# end
62-
63-
# i = 2 * n - 1
64-
# k = 2 * n - 1
65-
# while k >= n do
66-
# if a[i]
67-
# a[k] = a[i] unless k == i
68-
# k -= 1
69-
# end
70-
# i -= 1
71-
# end
72-
73-
# b.each_with_index do |e, i|
74-
# a[i] = e
75-
# end
76-
77-
# merge_sort(a, start: n, finish: 2*n - 1, buffer: b)
78-
79-
# p b
80-
# p a
81-
# p a.sort
82-
# p a == a.sort
25+
Alternate solution hint: use 9 counters.

0 commit comments

Comments
 (0)