当前位置: 首页 > 知识库问答 >
问题:

为什么在快速排序中分区之前,枢轴元素移动到数组的第一个或最后一个位置?

严修德
2023-03-14

我在一些地方读到,如果我们不选择第一个或最后一个html" target="_blank">元素作为轴心,我们应该在分区开始之前首先将其与第一个或最后一个位置交换。所以我尝试了一个例子,我用这个算法得到了正确的分区https://www.cs.auckland.ac.nz/software/AlgAnim/qsort1a.html
此分区方法使用左指针和右指针。它将左指针移向中心,直到找到大于轴的图元。然后将右指针移向中心,直到找到一个小于轴的元素。如果右指针

12、14、17、11、13、15、16、18(掉期18和14)

12、14、13、11、17、15、16、18(互换17和13)

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

共有1个答案

皇甫卓君
2023-03-14

霍尔分区方案在概念上与问题中的示例相似,不同之处在于初始枢轴值可以从数组中的任何位置获取,并且不执行特殊的结束情况交换,因为枢轴值和枢轴指针在霍尔分区期间将最终位于其正确的位置。

下面是一个快速排序的示例,它使用中位数3、霍尔分区方案、排除与pivot相邻或等于pivot的元素(它们已被排序),并且仅在较小的分区上使用递归将最坏情况下的堆栈空间限制为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;
        }
    }
}
 类似资料:
  • 我试图实现就地快速排序,最后一个元素作为我的支点。下面附上我的代码 出于某种原因,我的代码给了我一个IndexOutOfBounds异常,它不能准确地对数组排序。我不知道为什么会出现这个错误。 如果我理解正确,我们应该把最后一个元素作为我们的轴心。然后,我们将左指针向右迭代,直到找到一个大于枢轴的元素。之后,我们从右侧(继续向左移动)执行相同的操作,直到找到一个小于轴的元素。然后我们交换这些元素,

  • 我正在读关于快速排序的书,看不同的实现,我正试着去想一些事情。 在这个实现中(当然可以),枢轴被选为中间元素,然后左右指针相应地向右和向左移动,将元素交换到围绕枢轴的分区中。 我正在尝试数组[4,3,2,6,8,1,0]。 在第一个分区上,pivot为6,并且所有左侧元素都已小于6,因此左指针将停止在pivot处。在右侧,我们将0与6交换,然后1与8交换,因此在第一次迭代结束时,数组将如下所示:

  • 我有一个复杂对象的数组列表。我需要将这些框中的特定元素移动到arrayList的最后一个位置,并移除原始元素,如图所示: 我的代码是这样的,但我得到了这个错误:

  • 本文向大家介绍JavaScript数组中的第一个元素和最后一个元素?,包括了JavaScript数组中的第一个元素和最后一个元素?的使用技巧和注意事项,需要的朋友参考一下 数组是一组元素。每个元素都有其自己的 索引值。我们可以使用这些索引访问任何元素。但是,对于最后一个元素,直到知道数组中存在的元素数量,我们才知道索引。在这种情况下,我们必须使用逻辑。让我们简要地讨论这些细节。 访问第一个元素 因

  • 问题内容: 我很难弄清楚如何移动数组元素。例如,给出以下内容: 我为什么能写入移动功能之前? 还是之后? 移动后,应更新其余元素的索引。这意味着在第一个示例中,移动后arr [0] =’a’,arr [1] =’d’arr [2] =’b’,arr [3] =’c’,arr [4] = ‘e’ 这似乎应该很简单,但是我无法将其包裹住。 问题答案: 如果您想在npm上使用一个版本,则array-mo

  • 返回一个数组中除了最后一个元素以外的所有元素。 使用 arr.slice(0,-1) 返回排除了最后一个元素的数组。 const initial = arr => arr.slice(0, -1); initial([1, 2, 3]); // [1,2]