@@ -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 )
128100end
129101
130102n = 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
137114end
138115
139116require "benchmark"
140- puts Benchmark . measure { "a" *1_000_000_000 }
141117
142118h = { }
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 ) } "
146128end
147- p h
0 commit comments