Algorithm 霍尔&x27;s对洛穆托';s分割
你能举一个例子说明2个划分方案给出不同的结果吗? 有了洛穆托,我们必须写: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
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]