求大神看看我的快排代码为什么这么慢

 #include<iterator>
#include<iostream>
#include<string>
#include<vector>
#include<functional>
#include<random>
#include<algorithm>
using namespace std;
template<typename T, typename F=less<typename T::value_type>>  void Quick_sort(T begin, T end,F f=less<typename T::value_type>()) {
    if (begin == end)//终结条件没有元素!!!
        return;
    uniform_int_distribution<unsigned> u(0, end - begin - 1);
    default_random_engine e;
    int r = u(e);
    auto tem = *(end - 1);
    *(end - 1) = *(begin + r);
    *(begin + r) = tem;
    auto mainobject = *(end - 1);
    T i = begin;
    T j = i;
    while (j != end) {
        j = i;
        while (j != end) {
            if (f(*j,mainobject)) {
                auto tem = *j;
                *j = *i;
                *i = tem;
                ++i;
                break;
            }
            else {
                ++j;
            }
        }
    }
    *(end - 1) = *i;
    *i = mainobject;
    Quick_sort(begin, i,f);
    Quick_sort(i + 1, end,f);
}

您的快排代码中的主要瓶颈在于内部的两个嵌套循环,这会导致算法的时间复杂度达到 O(n^2),当数据规模较大时,算法的性能就会变得很差。

另外,您的代码中使用了随机化的方法选择主元,这是一个很好的优化,但是您在每次递归时都重新创建了一个随机数生成器对象,这会降低程序的效率,建议将随机数生成器对象作为函数的静态变量或全局变量,这样可以避免在每次递归时都重新创建一个新的随机数生成器对象。

此外,建议在比较元素大小时,使用 const 引用来避免不必要的拷贝,这样可以提高程序的效率。

下面是一个优化后的快排代码,您可以参考一下:

template<typename T, typename F=less<typename T::value_type>>
void Quick_sort(T begin, T end, F f=less<typename T::value_type>()) {
    if (begin == end)
        return;
    static default_random_engine e;
    uniform_int_distribution<unsigned> u(0, end - begin - 1);
    int r = u(e);
    iter_swap(begin + r, end - 1);
    auto mainobject = *(end - 1);
    auto i = begin;
    for (auto j = begin; j != end - 1; ++j) {
        if (f(*j, mainobject)) {
            iter_swap(i, j);
            ++i;
        }
    }
    iter_swap(i, end - 1);
    Quick_sort(begin, i, f);
    Quick_sort(i + 1, end, f);
}

这个代码中,我们将随机数生成器对象作为函数的静态变量,避免了在每次递归时重新创建一个新的随机数生成器对象;使用 iter_swap 函数来交换元素,这可以避免不必要的拷贝操作;使用 for 循环来替代内部的两个嵌套循环,简化了程序的逻辑,提高了程序的效率。