我有这个快速排序算法,它使用 lomuto 分区和确定主元的特殊方法(1.找到数组中的中间元素,midIter 2.找到 vec.begin()、midIter 和 vec 之间的最大和最小元素.end(), 3. 找到最大值和最小值之间的中间元素并使用它作为基准)。
Lomuto 分区代码:
vecIter lomPart(vecIter begin, vecIter end) {
vecIter leftEndIter = begin + 1;
for (vecIter n = begin + 1; n < end; ++n) {
if (*n <= *begin) {
std::swap(*leftEndIter, *n);
++leftEndIter;
}
}
std::swap(*begin, *(leftEndIter-1));
return leftEndIter - 1;
}
排序算法代码
void quicksort(vecIter begin, vecIter end) {
if (end - begin <= 1) {
return;
}
auto midIter = begin + std::floor((end - begin)/2);
vecIter max = findMax(begin, midIter, end);
vecIter min = findMin(begin, midIter, end);
vecIter pivotElem = min + std::floor((double)(max - min)/2);
vecIter pivotIt = lomPart(pivotElem, end);
quicksort(begin, pivotIt+1);
quicksort(pivotIt+1, end);
}
算法在某些向量(如 {3, 2, 1})上运行良好但失败(如 { -382, -4, 1000, 67, 90, 98 })