为什么我们只在霍尔的快速排序中包含枢轴 1/2 的时间?



根据维基百科,霍尔的分区(部分代码)看起来像:

// Sorts a (portion of an) array, divides it into partitions, then sorts those
algorithm quicksort(A, lo, hi) is 
if lo >= 0 && hi >= 0 && lo < hi then
p := partition(A, lo, hi) 
quicksort(A, lo, p) // Note: the pivot is now included
quicksort(A, p + 1, hi) 

我很好奇为什么枢轴包含在lo。。。p调用,但不在p+1…hi调用中(而它们在Lomuto的分区中都被排除在外)。

维基百科写道:

使用此公式,一个子范围可能是整个原始范围,这将阻止算法前进。因此,霍尔规定,在结束时,在(如有必要)将包含枢轴元件的子范围与最接近分离的子范围元件交换之后,可以通过排除该枢轴来减小包含枢轴元件(其仍处于其原始位置)的子范围的大小;从而确保了快速排序的终止。

为什么我们被允许在lo。。。p子范围,但不在p+1…hi子范围内?按照上面维基百科页面中的相同逻辑。。。p子范围正是原始范围,难道我们不会遇到同样的无限递归问题吗?

索引p可能不是透视索引。在分区步骤中,与枢轴或枢轴本身相等的元素可能会出现在任何位置。在分区步骤之后,元素<=枢轴向左或在p处,元素>=枢轴位于CCD_ 3的右侧。通过允许交换pivot或与pivot相等的元素,内部循环不需要进行边界检查。Hoare分区方案的另一个优点是,随着重复数的增加,它变得更快(尽管经常交换相等的元素),而Lomuto变得更慢,如果所有元素都相等,则会降低到O(n^2)的时间复杂性。

最新更新