#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 循环来替代内部的两个嵌套循环,简化了程序的逻辑,提高了程序的效率。