霍尔的VS洛穆托的分区

时间:2019-06-17 03:57:10

标签: algorithm sorting quicksort

能否举个例子,说明2个分区方案给出不同的结果? 使用Lomuto,我们必须编写:

quicksort(A,l,p)
quicksort(A,p+1,h)

与Hoare在一起时:

quicksort(A,l,p+1)
quicksort(A,p+1,h)

(操作在[low,high]中执行)

有什么区别?

3 个答案:

答案 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的调用。

Lomuto partition scheme

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

Hoare partition scheme

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]

enter image description here (将以上内容添加为图片,因为我无法在此处插入带格式的表格。请单击图片以获得更好的视图。)

  • 此外,Hoare的方案比Lomuto的分区方案更有效,因为它的交换次数平均减少了三倍,即使所有值都相等,它也可以创建有效的分区。

我刚刚提到了关键区别点。我建议您阅读以上两个超链接。您可能需要阅读this,以获得有关此主题的更多知识。

如果您有任何疑问,请发表评论,我们将帮助您解决疑问。

答案 2 :(得分:0)

基本的Lomuto分区方案交换枢轴,进行分区,将枢轴交换到位,然后在其排序位置返回索引到枢轴。在这种情况下,可以从递归调用中排除枢轴:

基本的Hoare分区方案从两端扫描到分区中的某个点,将小于枢轴的所有元素放在大于枢轴的所有元素的左侧,但等于枢轴的所有元素(包括枢轴本身)可以终止于分区中的任何位置,并且返回的索引是左侧(元素<=枢轴)和右侧(元素> =枢轴)之间的分割点,因此调用代码无法排除从Hoare分区函数返回的索引处的元素来自递归调用。如果将Hoare方案修改为与Lomuto相似,在该方案中,将枢轴交换到任一端,进行分区,然后将枢轴交换到拆分索引,则调用代码可以排除枢轴,但这会变慢。