部分排序的Quicksort

时间:2016-05-01 04:03:31

标签: c++ algorithm quicksort

我想将quicksort修改为我只对顶部中间项进行排序的地方。 所以这样的集合[9 5 7 1 2 4 6]其中5是中位数,部分排序的集合将类似于[1 2 4 5 9 6 7]。

template <class Comparable>
void objectSwap(Comparable &lhs, Comparable &rhs) {
    Comparable tmp = lhs;
    lhs = rhs;
    rhs = tmp;
}

template <class Comparable>
void choosePivot(vector<Comparable> &a, int first, int last) {
    int middle = (first + last) / 2;
    objectSwap(a[first], a[middle]);
}

template <class Comparable>
void partition(vector<Comparable> &a, int first, int last, int &pivotIndex) {
    // place the pivot in a[first]
    choosePivot(a, first, last);
    Comparable pivot = a[first];
    int lastS1 = first;
    int firstUnknown = first + 1;

    for (; firstUnknown <= last; ++firstUnknown) {
        if (a[firstUnknown] < pivot) {
            ++lastS1;
            objectSwap(a[firstUnknown], a[lastS1]);
        }
        // else item from unknown belongs in S2
    }
    // decide a new pivot
    objectSwap(a[first], a[lastS1]);
    pivotIndex = lastS1;
}

template <class Comparable>
void partialsort(vector<Comparable> &a, int first, int last) {
    int pivotIndex;

    if (first < last) {  
        partition(a, first, last, pivotIndex);
        partialsort(a, first, pivotIndex - 1);
        partialsort(a, pivotIndex + 1, last);
    }
}

template <class Comparable>
void partialsort(vector<Comparable> &a) {
    partialsort(a, 0, a.size() - 1);
}

我一直在观看mycodeschool对youtube上的quicksort的分析(让我知道任何其他好的视频,如果你知道的话!),我很确定我只需要更改partialsort(vector,int) ,int)方法。
我的第一个反应是将它想象为mergesort,取一个空数组,并在填充长度/ 2后停止算法。但我知道这不是quicksort的工作原理。所有递归调用以及first,last和pivot总是如何变化,使我很难跟踪正在发生的事情。我也不确定当我有中位数时我怎么知道。 这是一个家庭作业的问题,所以如果有人提出我应该如何处理这个或资源以帮助我更好地理解quicksort,我会非常感激。只是知道如何改变它对我更好地理解算法没有多大帮助 对不起,如果听起来我有权获得我想要的帮助!

1 个答案:

答案 0 :(得分:0)

这是一种分而治之的算法,所以你可以跳过任何完全位于数组中间位置的分区,一旦前半部分被分类,它将自然保持中值。