對於這種排序算法我寫的,我有兩個問題:命名排序算法。它是QuickSort嗎?
1.當我填寫的範圍矢量[max-num, 0]
(最壞的情況),我得到的方式比O(n^2)
更好的結果。 (我甚至不確定我是否寫過一個快速排序)。
2.當我混合範圍,例如:我填充未排序的矢量[0, max-num/2]
然後[max-num/2, 0]
,奇怪的是它運行崩潰到數字900,000,但後來崩潰。
template<class writeIter>
void quicksort(writeIter begin, writeIter end)
{
if (begin!= end) {
int diff = end-begin;
if (diff > 2) {
writeIter pivot = ((end-begin)/2) + begin;
writeIter itFirst = begin;
writeIter itSecnd = end-1;
auto pivotVal = *pivot;
swap(*pivot, *(end-1));
while (itFirst < itSecnd) {
if (*itFirst > pivotVal) {
while (*itSecnd > pivotVal && itSecnd > itFirst) --itSecnd;
if (itSecnd > itFirst)
swap(*itFirst, *itSecnd);
}
++itFirst;
}
swap(*itSecnd, *(end-1));
quicksort(begin, itSecnd);
quicksort(itSecnd, end);
}
else if (diff == 2)
if (*begin > *(begin+1))
swap(*begin, *(begin+1));
}
}
您有*三個*問題。第一個答案是'是',模塊錯誤。 – EJP
你可能有堆棧溢出。該算法將每次選擇一個非常糟糕的支點(接近最大值),並將該範圍劃分爲極不平坦的部分。這對快速排序很不利。 –