40 lines
749 B
Ruby
40 lines
749 B
Ruby
|
# Quick 3-way sort version,
|
||
|
# to protect against the worst case an array should be shuffled before,
|
||
|
# see examples in test/quick3way_sort_test.rb
|
||
|
class Quick3way
|
||
|
def initialize(array)
|
||
|
@array = array
|
||
|
end
|
||
|
|
||
|
def sort
|
||
|
sort3way(@array, 0, @array.length - 1)
|
||
|
@array
|
||
|
end
|
||
|
|
||
|
private
|
||
|
|
||
|
def sort3way(array, lo, hi)
|
||
|
return if lo >= hi
|
||
|
pivot = array[lo]
|
||
|
gt = hi
|
||
|
lt = lo
|
||
|
i = lo + 1
|
||
|
|
||
|
while i <= gt
|
||
|
if array[i] < pivot
|
||
|
array[i], array[lt] = array[lt], array[i]
|
||
|
lt += 1
|
||
|
i += 1
|
||
|
elsif array[i] > pivot
|
||
|
array[i], array[gt] = array[gt], array[i]
|
||
|
gt -= 1
|
||
|
else
|
||
|
i += 1
|
||
|
end
|
||
|
end
|
||
|
|
||
|
sort3way(array, lo, lt - 1)
|
||
|
sort3way(array, gt + 1, hi)
|
||
|
end
|
||
|
end
|