我正在尝试在ruby中实现快速排序,但是遇到了如何在第一个透视分区后递归调用的问题。请帮助我理解如何继续,并让我知道我的编码风格是否良好。
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
6条答案
按热度按时间0tdrvxhp1#
下面是我在Ruby中实现快速排序的方法:
实际上,我可能会将它改为
Array
的示例方法:rkue9o1l2#
下面是一个(非常)简单的快速排序实现,它基于维基百科的简单快速排序伪代码:
您需要一个基本情况,否则递归调用永远不会终止
现在选择一个轴:
循环遍历数组,比较要透视的项,并将它们收集到
less
和greater
数组中。现在,在
less
和greater
数组上递归调用quicksort()
。返回
sorted_array
,就完成了。您可以使用
gmol16393#
这是另一种实现quicksort的方法--作为新手,我认为它更容易理解--希望它能帮助到别人:)在这个实现中,pivot总是数组中的最后一个元素--我遵循Khan Academy course,这就是我得到灵感的地方
gpnt7bae4#
我的实现基于Grokking-Algorithms book的递归算法:
yhqotfr85#
af7jpaap6#