为什么在Quicksort中进行分区之前将枢轴元素移动到数组的第一个或最后一个位置?

傻子

我在某些地方读到,如果不选择第一个或最后一个元素作为枢轴,则应该在分区开始之前先将其与第一个或最后一个位置交换。因此,我尝试了一个示例,并使用此算法https://www.cs.auckland.ac.nz/software/AlgAnim/qsort1a.html 获得了正确的分区。
此分区方法使用左指针和右指针。它将左指针移向中心,直到找到比枢轴更大的元素。然后,它将右指针移向中心,直到找到小于枢轴的元素。如果rightpointer> leftpointer。这两个位置的值被交换。最后,将枢轴放置在右指针的位置。
对于输入阵列12、18、17、11、13、15、16、14,选择元素15作为枢轴。
这些步骤是:
12、18、17、11、13、15、16、14

12,14,17,11,11,13,15,16,18(交换18和14)

12,14,13,11,17,17,15,16,18(交换17和13)

12,14,13,11,15,15,17,16,18(交换15和17)

rcgldr

霍尔分区方案是在概念上的问题的例子类似,不同的是初始枢转值可以从任何地方在阵列内作出,并且不执行特殊的端的情况下交换,当枢转值和枢轴指针将结束在Hoare分区期间处于正确位置。

这是一个快速排序的示例,该示例使用3的中位数,Hoare分区方案,排除与枢轴相邻且相等的元素(它们已经排序),并且仅对较小的分区使用递归将最坏情况的堆栈空间限制为O(log (n))。

void QuickSort(uint32_t a[], size_t lo, size_t hi) {
    while(lo < hi){
        size_t i = lo, j = (lo+hi)/2, k = hi;
        uint32_t p;
        if (a[k] < a[i])            // median of 3
            std::swap(a[k], a[i]);
        if (a[j] < a[i])
            std::swap(a[j], a[i]);
        if (a[k] < a[j])
            std::swap(a[k], a[j]);
        p = a[j];
        i--;                        // Hoare partition
        k++;
        while (1) {
            while (a[++i] < p);
            while (a[--k] > p);
            if (i >= k)
                break;
            std::swap(a[i], a[k]);
        }
        i = k++;
        // at this point, a[i] or a[k] or both == p  (pivot value)
        while(i > lo && a[i] == p)  // exclude middle values == pivot
            i--;
        while(k < hi && a[k] == p)
            k++;
        // recurse on smaller part, loop on larger part
        if((i - lo) <= (hi - k)){
            QuickSort(a, lo, i);
            lo = k;
        } else {
            QuickSort(a, k, hi);
            hi = i;
        }
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

将数组元素移动到第一个位置但保持顺序

隐藏其他元素后将图像移动到第一个位置

将 DOM 元素的第一个子元素移动到最后一个位置而不创建垃圾节点

如何将复制的工作表移动到第一个位置?

将ArrayList元素移动到列表中的最后一个位置?

为什么在的assertEquals可选的断言消息移动到的Junit 5的最后一个位置?

将数组元素从一个数组位置移动到另一个位置

将单击的元素移动到第一个

向上移动/移动数组中的对象,然后将第一个元素移动到最后一个索引

查找排序数组中元素的第一个和最后一个位置

如何将 JSON 对象的第一个元素移动到最后?

将第一个单词移到Java中的最后一个位置

为什么元素在动画后回到第一个位置?

将元素移到数组中的第一个位置

使用XSLT 2将元素从一个位置移动到另一个位置

将 XAML 元素从一个位置移动到另一个位置

有条件将数组元素从一个位置移动到另一个位置

如何将零轴移动到python中的最后一个位置?

MotionLayout我无法将RecyclerView滚动到第一个位置

单击第一个元素时的JavaScript滑块移动到最后一个元素

为什么awk split()使第一个字段成为数组中的最后一个元素?

如何转换所有元组的第一个元素,然后在Python中移动一个位置?

如何将节点元素移动到其父元素中的第一个元素

提取数据集中的第一个和最后一个位置

获取颜色的第一个和最后一个位置

Viewpager检测第一个和最后一个位置

为什么awk中的split(string,regex)使用最后一个字段在第一个位置?

打印链接列表时,最后一个元素值出现在第一个和最后一个位置

如何通过在第一个位置插入元素来更新数组