Quick Sort in Ruby language
quicksort, ruby
Solution
This is how I would implement quick sort in Ruby:
def quicksort(*ary)
return [] if ary.empty?
pivot = ary.delete_at(rand(ary.size))
left, right = ary.partition(&pivot.method(:>))
return *quicksort(*left), pivot, *quicksort(*right)
end
Actually, I would probably make it an instance method of `Array` instead:
class Array
def quicksort
return [] if empty?
pivot = delete_at(rand(size))
left, right = partition(&pivot.method(:>))
return *left.quicksort, pivot, *right.quicksort
end
end
Problem
I am trying to implement Quick sort in ruby but stuck in how to call recursively after the first partition of pivot. Please help me to understand on how to proceed and also let me know whether my style of coding is good so far . ``` class QuickSort $array= Array.new() $count=0 def add(val) #adding values to sort i=0 while val != '000'.to_i $array[i]= val.to_i i=i+1 val = gets.to_i end end def firstsort_aka_divide(val1,val2,val3) #first partition $count = $count+1 @pivot = val1 @left = val2 @right =val3 while @left!=@right do # first divide/ partition logic if $array[@right] > $array[@pivot] then @right= @right-1 elsif $array[@right] < $array[@pivot] then @var = $array[@right] $array[@right] = $array[@pivot] $array[@pivot] = @var @pivot = @right @left = @left+1 end if $array[@left] < $array[@pivot] @left= @left+1 elsif $array[@left] > $array[@pivot] @var = $array[@left] $array[@left] = $array[@pivot] $array[@pivot] = @var @pivot =@left end end puts "\n" # printing after the first partition i.e divide print " Array for for divide ---> #{$array}" puts "\n" puts " pivot,left,right after first divide --> #{@pivot},#{@left},#{@right}" firstsort_aka_divide() # Have to call left side of partition recursively -- need help firstsort_aka_divide() # Have to call right side of partition recursively -- need help end end ob= QuickSort.new puts " Enter the numbers you want to sort. \n Press '000' once you are done entering the values" val = gets.to_i ob.add(val) puts " Sorting your list ..." sleep(2) ob.firstsort_aka_divide(0,0,($array.size-1)) # base condition for partitioning ```