能否举个例子,说明2个分区方案给出不同的结果? 使用Lomuto,我们必须编写:
quicksort(A,l,p)
quicksort(A,p+1,h)
与Hoare在一起时:
quicksort(A,l,p+1)
quicksort(A,p+1,h)
(操作在[low,high]中执行)
有什么区别?
答案 0 :(得分:0)
这些分区之间的区别不在请求调用中。
实际上任何分区(支持正确的接口)都可以与主例程的相同实现一起使用。
分区功能通常返回数据透视表的索引。这个枢纽已经站在最后的位置。不需要再次处理该索引。
因此,对于low
被包括在治疗中但high
不包括在内的情况,我们可以写
pivotindex = partition(arr, low, high);
// Separately sort elements before pivotindex and after pivotindex
quickSort(arr, low, pivotindex);
quickSort(arr, pivotindex + 1, high);
答案 1 :(得分:0)
要了解它们之间的区别,我们还需要关注partition
方法,而不仅是对quicksort
的调用。
algorithm partition(A, lo, hi) is
pivot := A[hi]
i := lo
for j := lo to hi - 1 do
if A[j] < pivot then
swap A[i] with A[j]
i := i + 1
swap A[i] with A[hi]
return i
algorithm partition(A, lo, hi) is
pivot := A[lo + (hi - lo) / 2]
i := lo - 1
j := hi + 1
loop forever
do
i := i + 1
while A[i] < pivot
do
j := j - 1
while A[j] > pivot
if i >= j then
return j
swap A[i] with A[j]
(将以上内容添加为图片,因为我无法在此处插入带格式的表格。请单击图片以获得更好的视图。)
我刚刚提到了关键区别点。我建议您阅读以上两个超链接。您可能需要阅读this,以获得有关此主题的更多知识。
如果您有任何疑问,请发表评论,我们将帮助您解决疑问。
答案 2 :(得分:0)
基本的Lomuto分区方案交换枢轴,进行分区,将枢轴交换到位,然后在其排序位置返回索引到枢轴。在这种情况下,可以从递归调用中排除枢轴:
基本的Hoare分区方案从两端扫描到分区中的某个点,将小于枢轴的所有元素放在大于枢轴的所有元素的左侧,但等于枢轴的所有元素(包括枢轴本身)可以终止于分区中的任何位置,并且返回的索引是左侧(元素<=枢轴)和右侧(元素> =枢轴)之间的分割点,因此调用代码无法排除从Hoare分区函数返回的索引处的元素来自递归调用。如果将Hoare方案修改为与Lomuto相似,在该方案中,将枢轴交换到任一端,进行分区,然后将枢轴交换到拆分索引,则调用代码可以排除枢轴,但这会变慢。