为什么我的快速排序比合并排序慢?

时间:2021-03-22 17:49:02

标签: c++ performance sorting merge

这是我的实现。当我放置 10000 个大小为 1000000 的数组时,它排序了 300 秒。 我的另一个算法,归并排序执行 40 秒。 我想知道是否有一些事情会减慢我的算法。

template <typename TYP> void quick_sort(TYP *tab, int poczatek, int koniec) {
  int i = poczatek;
  int j = poczatek;
  int srodek = (poczatek + koniec) / 2;
  int piwot = tab[srodek];

  swap(tab[srodek], tab[koniec]);

  for (i = poczatek; i < koniec; i++) {
    if (tab[i] < piwot) {
      swap(tab[i], tab[j]);
      j++;
    }
  }
  swap(tab[koniec], tab[j]);

  if (poczatek < j - 1)
    quick_sort(tab, poczatek, j - 1);

  if (j + 1 < koniec)
    quick_sort(tab, j + 1, koniec);
}

1 个答案:

答案 0 :(得分:2)

快速排序的平均运行时间为 O(n log(n)),但如果枢轴选择不当,最坏情况复杂度为 O(n^2)。关于您的输入数组,您选择的枢轴可能非常糟糕。为防止出现这种情况,您可以实施 Introsort。此外,您可以使用更好的方法来选择枢轴:例如 median-of-three 规则。

此外,快速排序对于小数组来说很慢。例如,对于小于 15 的数组,您可以使用 insertion-sort 显着提高其性能。最后的递归调用会更快,从而使整体执行速度更快。

最后,您的快速排序使用 Lomuto 分区方案,这可能不是最有效的。您可以尝试使用Hoare 的分区方案

相关问题