Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 霍尔&x27;s对洛穆托';s分割_Algorithm_Sorting_Quicksort - Fatal编程技术网

Algorithm 霍尔&x27;s对洛穆托';s分割

Algorithm 霍尔&x27;s对洛穆托';s分割,algorithm,sorting,quicksort,Algorithm,Sorting,Quicksort,你能举一个例子说明2个划分方案给出不同的结果吗? 有了洛穆托,我们必须写: quicksort(A,l,p) quicksort(A,p+1,h) 而霍尔的: quicksort(A,l,p+1) quicksort(A,p+1,h) (在[低、高]状态下执行的操作) 有什么区别吗?这些分区之间的区别不在于请求调用 实际上,任何分区(支持正确接口)都可以与主例程的相同实现一起使用 分区函数通常返回透视图的索引。此透视图已位于最终位置。无需再次处理此索引 因此,对于治疗中包括low但不包括hi

你能举一个例子说明2个划分方案给出不同的结果吗? 有了洛穆托,我们必须写:

quicksort(A,l,p)
quicksort(A,p+1,h)
而霍尔的:

quicksort(A,l,p+1)
quicksort(A,p+1,h)
(在[低、高]状态下执行的操作)


有什么区别吗?

这些分区之间的区别不在于请求调用

实际上,任何分区(支持正确接口)都可以与主例程的相同实现一起使用

分区函数通常返回透视图的索引。此透视图已位于最终位置。无需再次处理此索引

因此,对于治疗中包括
low
但不包括
high
的情况,我们可以写

    pivotindex = partition(arr, low, high); 

    // Separately sort elements before pivotindex and after pivotindex

    quickSort(arr, low, pivotindex); 
    quickSort(arr, pivotindex + 1, high); 

为了理解差异,我们还需要关注
分区
方法,而不仅仅是调用
快速排序

:

算法分区(A、lo、hi)为
枢轴:=A[hi]
i:=lo
对于j:=lo至hi-1 do
如果A[j]<枢轴,则
用A[j]交换A[i]
i:=i+1
用[hi]交换[i]
返回i
:

算法分区(A、lo、hi)为
枢轴:=A[lo+(hi-lo)/2]
i:=lo-1
j:=hi+1
永远循环
做
i:=i+1
而[我]<支点
做
j:=j-1
而[j]>支点
如果i>=j,那么
返回j
用A[j]交换A[i]
(由于无法在此处插入格式化表,因此将上述内容添加为图像。请单击图像以获得更好的查看。)

  • 此外,Hoare的方案比Lomuto的分区方案效率更高,因为它平均交换次数少三倍,而且即使所有值相等,它也能创建有效的分区
我刚刚提到了关键的区别点。我建议你阅读上面的两个超链接。你可能想通过阅读获得更多关于这个主题的知识


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

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

基本的霍尔分区方案从两端向分区内的某个点扫描,将小于轴的所有元素放在大于轴的所有元素的左侧,但与轴相等的任何元素(包括轴本身)都可以在分区中的任何位置结束,返回的索引是l轴之间的拆分点eft(元素=轴),因此调用代码无法从递归调用中排除从Hoare分区函数返回的索引处的元素。如果Hoare方案被修改为类似于Lomuto,它将轴交换到任一端,进行分区,然后将轴交换到拆分索引,则调用代码可以排除轴,但这最终是错误的慢一点

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]