我尝试使用迭代器编写通用的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;
}
答案 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);
}