快速排序的平均时间复杂度是N*logN,同时其也是实践已知的最快的通用排序算法,但是其最坏情况的时间复杂度依然是N的平方,但是只要我们对快速排序算法稍作修改,就可以保证其最坏情况的时间复杂度也是N*logN。
思路就是在递归达到一定深度后,将快速排序的递归调用改为堆排序,下面是我实现的代码,我将递归深度设置为
2*ln(N),这个值也是很多算法书籍推荐的值。
#include <iostream>
#include <algorithm>
#include <utility>
#include <cstdlib>
#include <ctime>
#include <random>
#include <limits>
#include <cmath>
#include <chrono>
#include <cassert>
inline int left_child(int rt) { return 2 * rt + 1; }
void percolate_down(int *a,int rt,int sz)
{
int tmp = a[rt];
int child = left_child(rt);
for(;child < sz;rt = child,child = left_child(rt))
{
if(chi