1.1 快排的典型写法
void quick_sort(vector<int> vct, int left, int right)
{
int l=left;
int r=right;
int key=vct[l];
int tmp;
while(l<r)
{
while(vct[r]>=key && l<r){r--;}
while(vct[l]<=key && l<r){l++;}
if(l<r) swap(vct[l],vct[r]);
}
swap(vct[l],vct[left]);
quick_sort(vct, left, l-1);
quick_sort(vct, l+1, right);
}
1.2 时间复杂度计算
最差情况: 已排好序(正序/逆序), 一侧已无可分, 一次小1,需比较O(n)次, n*O(n)=O(n^2)
平均情况: 按左右均等裂变, 一次裂变(缩范围1个)需比较O(n)次, 裂变n个需log2(n)次, log2(n) * O(n)=O(log(n)*n)
精准计算: 参考知乎
↑最差情况
↑1:3分情况
2.1 调和数
计算时间复杂度的精确解时用到的调和平均数(Harmonic Number)
至此认为调和数发散
欧拉给出的值Hn≈ln(n)+C, 欧拉常数值:C≈0.57721566490153286060651209