我的快速排序在对预排序的项目进行排序时失败,如何改进?

My Quicksort fails when sorting pre-sorted items, how to improve?

本文关键字:排序 失败 何改进 项目 快速排序 我的      更新时间:2023-10-16

这是一个标准的递归快速排序实现,它成功地对未排序的项目的较大列表进行排序,但不能对"预排序"的项目进行排序。我知道这需要更长的时间,但不会完全失败。有什么可能的改进吗?

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( 或堆栈溢出。

您应该考虑以下替代方案:

  • 随机索引
  • 中间索引
  • 三个指数(第一个、中间、最后一个(的中位数
  • 更复杂的东西,如中位数(第九(