我的快速排序在对预排序的项目进行排序时失败,如何改进?
My Quicksort fails when sorting pre-sorted items, how to improve?
这是一个标准的递归快速排序实现,它成功地对未排序的项目的较大列表进行排序,但不能对"预排序"的项目进行排序。我知道这需要更长的时间,但不会完全失败。有什么可能的改进吗?
void quickSort(int *array, size_t count) {
int pivot = array[count - 1];
int max_index = 0;
for (size_t i = 0; i < count - 1; ++i)
{
if (array[i] < pivot) {
swap(array[i], array[max_index]);
++max_index;
}
}
swap(array[max_index], array[count - 1]);
if (max_index > 1)
quickSort(array, max_index);
if (count - max_index - 1 > 1)
quickSort(array + max_index + 1, count - max_index - 1);
}
我认为您的问题是枢轴值的选择。您使用的是最右边的值 (array[count-1]
(,这可能会导致已排序序列的最坏情况行为。创建一个大小为 1 的分区和另一个大小为 n-1 的分区。这会导致 n-1 递归调用链,从而导致性能不佳 O(N2( 或堆栈溢出。
您应该考虑以下替代方案:
- 随机索引
- 中间索引
- 三个指数(第一个、中间、最后一个(的中位数
- 更复杂的东西,如中位数(第九(
相关文章:
- 如果没有malloc,链表实现将失败
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- 二叉排序树无法编译
- 仅使用绝对值对数组进行排序,并在C++中显示实际值
- 视图中的参数推导失败:take_while
- C++选择排序算法中的逻辑错误
- 链接到自行创建的dll失败
- 使用C++程序合并排序没有得到正确的输出
- 为什么链表的重新排序会失败?
- 我的快速排序在对预排序的项目进行排序时失败,如何改进?
- C++ 链表合并排序的实现在连接 1 个以上节点的子列表时失败
- 在某些情况下,我的快速排序实现失败
- 合并排序逻辑分配内存失败
- c++向量排序方法编译失败,返回预期表达式
- 气泡排序后BinSearch失败
- 将元素追加到向量会导致后续排序失败
- 为什么我的简单快速排序实现失败时,等效的元素在数组中
- 向量数组排序失败
- 数组排序失败