Общий QuickSort реализован с вектором и итераторами C ++ - PullRequest
0 голосов
/ 11 декабря 2018

Я пытался написать общую быструю сортировку, используя итераторы, но когда я скомпилировал ее, я получил эту ошибку:

"В экземпляре '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') Iter pivot (_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 голосов
/ 12 декабря 2018

Пример быстрой сортировки типа раздела Hoare.Обычно Hoare индексирует индексы до -1 и размера, но эквивалент итератора, равный -1, не допускается, поэтому первый экземпляр использует эквивалент 0 и размера-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);
}
...