使用 Lomuto 分区的排序算法不起作用

问题描述 投票:0回答:0

我有这个快速排序算法,它使用 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 })

quicksort
© www.soinside.com 2019 - 2024. All rights reserved.