命名排序算法.是快速排序吗
Naming the sorting algorithm. Is it QuickSort?
对于我编写的排序算法,我有两个问题:
1.当我范围填充向量[max-num, 0]
(最坏情况)时,我得到的结果比O(n^2)
好得多。(我甚至不确定我是否还写过快速排序)。
2.当我混淆范围时,例如:我先填充未排序的向量[0, max-num/2]
,然后填充[max-num/2, 0]
,奇怪的是,它的运行速度高达900000,但紧接着就崩溃了。
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));
}
}
是的,这是一种简单的快速排序。但您选择中间元素而不是最后一个元素作为轴心。
- 当你填充一个向量[max-num,0]时,它实际上是而不是最坏的情况。因为每次你选择中间元素作为轴心,将向量分成两部分大小几乎相同,因此时间复杂度为O(nlogn)
- 然而,当你填充未排序的向量[0,max num/2],然后填充[max num/2,0]时,这对你的算法来说是最坏的情况,因为你把向量分成两部分,一部分非常长,另一部分非常短。所以时间复杂度是O(n^2)
为了在几乎所有矢量上获得更好的性能,您可以:
- 选择一个随机元素作为轴心
- 随机挑选三个元素,然后选择第二大元素
- 当向量的大小足够小,例如小于10时,对其应用插入排序
- 为了处理所有元素彼此靠近的情况,可以在递归排序子向量以跳过等于pivot的元素之前做一些额外的工作
相关文章:
- C++运行时错误与快速排序算法抛出堆栈转储错误
- 快速排序函数在快速排序算法中如何工作?
- 这种快速排序算法有什么问题?
- 为什么我的递归快速排序算法有如此不平衡的分区
- 使用霍尔分区方案的快速排序算法返回原始未排序列表
- 如何在快速排序算法中使已排序数组的交换次数为零
- 快速排序算法,一些特定输入序列的错误答案和分段错误
- 为对象向量实现快速排序算法
- 快速排序算法改进,如果更多重复键
- 快速排序算法遇到问题
- 快速排序算法代码
- 快速排序算法不起作用
- c++快速排序算法中500000排序整数数组的Seg错误
- 整数的快速排序算法
- C++快速排序算法崩溃
- 快速排序算法不起作用
- 快速排序算法(递归)
- C++快速排序算法不断崩溃
- 具有重复关键字的快速排序算法
- 当对可被7整除的向量大小进行排序时,是否有什么东西会导致快速排序算法出错