我正在尝试通过获取要排序的向量的第一个,最后一个和中心元素的中位数来选择快速排序的轴。我已经看到了很多关于int的范围的实现,但是我试图用迭代器来做它。(不管怎么说它不应该那么不同)。但是,我的代码非常符合我的要求。当T是一个int时,它可以工作,但对于其他一些类,它会超时。有任何想法吗? 这是代码:
template <class T>
int ParallelSort::partition(typename vector<T>::iterator &start, typename vector<T>::iterator &end)
{
int Index = (end-start)/2;
T tmpSwap = start[Index];
//the three if statement get the three part median for the vector.
if(start[Index] < *start)
{
start[Index] = *start;
*start = tmpSwap;
}
if(*end < *start)
{
tmpSwap = *end;
*end = *start;
*start = tmpSwap;
}
if(*end < start[Index])
{
tmpSwap = start[Index];
start[Index] = *end;
*end = tmpSwap;
}
T pivot = start[Index];
//rest of the code .....
//i'm sure that the rest of the code works correctly
答案 0 :(得分:0)
首先,您应该使用typename std::vector<T>::size_type
,而不是int
。其次,使用std::distance
查找两个迭代器之间的差异,这两个迭代器应存储在typename std::vector<T>::difference_type
中。最后,迭代器通常按值传递,而不是通过引用传递。
您的问题很可能是您要取消引用end
。这是未定义的行为 - 您可能想要取消引用--end
。
此外,Iterators的重点在于您不会将自己局限于特定的容器(理论上,无论如何)。这可能应该写有签名:
template <typename SizeType, typename RandomAccessIterator>
SizeType ParallelSort::partition(RandomAccessIterator start, RandomAccessIterator end)