使用向量和迭代器C ++实现的通用Qu​​ickSort

时间:2018-12-11 10:21:08

标签: c++ sorting recursion quicksort

我尝试使用迭代器编写通用的quicksort,但出现此错误:

”在“ void QuickSortRec(std :: vector,Iter,Iter)[[T = int; Iter = __gnu_cxx :: __ normal_iterator>]的实例中”): Iterators.cpp:49:53:从此处开始 Iterators.cpp:133:28:错误:与“ operator /”不匹配(操作数类型为“ __gnu_cxx :: __ normal_iterator>”和“ int”)   迭代枢轴(_begin +(_end / 2));“

即使我没有在分区上使用该方法,此代码是否也代表了快速排序?

这是我的代码:

template<typename T, typename Iter>
void QuickSortRec(std::vector<T> _vector, Iter _begin, Iter _end)
{
    Iter pivot(_begin + (_end / 2));
    Iter left(_begin);
    Iter right(_end);

    while (left <= right)
    {
        while (*left < *pivot)
        {
            ++left;
        }

        while (*right > *pivot)
        {
            --right;
        }

        if (*left >= *right)
        {
            Swap(left, right);
            ++left;
            --right;
        }
    }

    if (_begin < right)
    {
        QuickSortRec(_vector, _begin, right);
    }

    if (left < _end)
    {
        QuickSortRec(_vector, left, _end);
    }
}

template<typename Iter>
void Swap(Iter _a, Iter _b)
{
    Iter temp(_b);
    *_b = *_a;
    *_a = *temp;
}

1 个答案:

答案 0 :(得分:0)

Hoare分区类型quicksort的示例。通常,Hoare的索引索引分别为-1和size,但是不允许迭代器使用-1,因此在进入主循环之前,第一个实例使用0和size-1的等效值。

template <typename I>
void QuickSort(I beg, I end)
{
    if (end - beg < 2)
        return;
    I lft(beg);
    I rgt(end-1);
    auto pvt = *(lft + (rgt-lft)/2);
    if(*lft < pvt)
        while (*++lft < pvt) ;
    if(*rgt > pvt)
        while (*--rgt > pvt) ;
    while (lft < rgt)
    {
        std::iter_swap(lft, rgt);
        while (*++lft < pvt) ;
        while (*--rgt > pvt) ;
    }
    rgt++;
    QuickSort(beg, rgt);
    QuickSort(rgt, end);
}