这是我的实现。当我放置 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);
}
答案 0 :(得分:2)
快速排序的平均运行时间为 O(n log(n))
,但如果枢轴选择不当,最坏情况复杂度为 O(n^2)
。关于您的输入数组,您选择的枢轴可能非常糟糕。为防止出现这种情况,您可以实施 Introsort。此外,您可以使用更好的方法来选择枢轴:例如 median-of-three 规则。
此外,快速排序对于小数组来说很慢。例如,对于小于 15 的数组,您可以使用 insertion-sort 显着提高其性能。最后的递归调用会更快,从而使整体执行速度更快。
最后,您的快速排序使用 Lomuto 分区方案,这可能不是最有效的。您可以尝试使用Hoare 的分区方案。