Skip to content

Commit da431aa

Browse files
committed
proper solution (use dijkstra qsort)
1 parent 9282214 commit da431aa

File tree

1 file changed

+40
-59
lines changed

1 file changed

+40
-59
lines changed

week3/quicksort/interview-questions/task1/solution.rb

Lines changed: 40 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -60,71 +60,43 @@ def sort(array1, array2, start: nil, finish: nil)
6060
divider1 = array1[(finish - start) / 2 + start]
6161
divider2 = nil
6262

63-
# p divider1.size
64-
65-
# p [start, finish, divider1, divider2]
66-
67-
# p array1
68-
# p array2
69-
# p "==="
70-
7163
left = start
7264
right = finish
73-
while left <= right
74-
left += 1 while array2[left] < divider1
75-
right -= 1 while array2[right] > divider1
76-
77-
unless divider2
78-
divider2 = array2[left] if array2[left] == divider1
79-
divider2 = array2[right] if array2[right] == divider1
80-
end
81-
82-
if left <= right
83-
# p [left, right, array2[left], array2[right]]
84-
array2[left], array2[right] = array2[right], array2[left]
85-
left += 1
65+
i = start
66+
while i <= right
67+
case array2[i] <=> divider1
68+
when -1
69+
array2[i], array2[left] = array2[left], array2[i]
70+
i += 1
71+
left += 1
72+
when 0
73+
divider2 = array2[i]
74+
i += 1
75+
when 1
76+
array2[i], array2[right] = array2[right], array2[i]
8677
right -= 1
8778
end
8879
end
89-
left1 = left
90-
right1 = right
91-
92-
# p array1[start..finish]
93-
# p array2[start..finish]
94-
# p [left, right]
95-
# p array2[left]
96-
# p [array2[start..right], divider1, array2[left..finish], :!, start, right, left, finish]
97-
98-
# p [start, finish, divider1, divider2, array1, array2]
9980

10081
left = start
10182
right = finish
102-
while left <= right
103-
left += 1 while array1[left] < divider2
104-
right -= 1 while array1[right] > divider2
105-
106-
if left <= right
107-
array1[left], array1[right] = array1[right], array1[left]
108-
left += 1
83+
i = start
84+
while i <= right
85+
case array1[i] <=> divider2
86+
when -1
87+
array1[i], array1[left] = array1[left], array1[i]
88+
i += 1
89+
left += 1
90+
when 0
91+
i += 1
92+
when 1
93+
array1[i], array1[right] = array1[right], array1[i]
10994
right -= 1
11095
end
11196
end
112-
left2 = left
113-
right2 = right
11497

115-
# p [array1[start..right], divider2, array1[left..finish], :!, start, right, left, finish]
116-
# p array1[start..finish]
117-
# p array2[start..finish]
118-
# p [left, right]
119-
# p array1[left]
120-
121-
# return if start == finish - 1
122-
123-
right = [right1, right2].max
124-
left = [left1, left2 ].min
125-
126-
sort(array1, array2, start: start, finish: right)
127-
sort(array1, array2, start: left, finish: finish)
98+
sort(array1, array2, start: start, finish: left - 1)
99+
sort(array1, array2, start: left + 1, finish: finish )
128100
end
129101

130102
n = 10
@@ -133,15 +105,24 @@ def test(n)
133105
bolt_pile = (0...n).map { |l| Bolt.new(l) }.shuffle
134106
nut_pile = (0...n).map { |l| Nut.new(l) }.shuffle
135107
sort(bolt_pile, nut_pile)
136-
bolt_pile.zip(nut_pile).all? { |bolt, nut| bolt == nut }
108+
109+
unless bolt_pile.zip(nut_pile).all? { |bolt, nut| bolt == nut }
110+
p bolt_pile
111+
p nut_pile
112+
raise "Not sorted"
113+
end
137114
end
138115

139116
require "benchmark"
140-
puts Benchmark.measure { "a"*1_000_000_000 }
141117

142118
h = {}
143-
[100, 1000, 10000, 1000000].each do |n|
144-
b = Benchmark.measure { raise unless test(n) }
145-
h[n] = b.real
119+
[100, 1000, 10000, 100000].each do |n|
120+
h[n] = 10.times.map { Benchmark.measure { test(n) }.real }.sum / 10
121+
end
122+
123+
min_k = h.keys.min
124+
min_v = h.values.min
125+
126+
h.each do |k, v|
127+
puts "#{k / min_k}:\t#{(v / min_v).round(2)}"
146128
end
147-
p h

0 commit comments

Comments
 (0)