1、递归算法的复杂度计算
就是子问题个数 x 解决一个子问题的复杂度。
(即每个子问题的复杂度之和)
执行的次数是二叉树节点的个数,每次执行的复杂度就是每个节点代表的子数组的长度,所以总的时间复杂度就是整棵树中「数组元素」的个数。
所以从整体上看,这个二叉树的高度是 logN,其中每一层的元素个数就是原数组的长度 N,所以总的时间复杂度就是 O(NlogN)。
2、归并排序模板
vector<int> tmp;
void mergeSort(vector<int> &nums, int lo, int hi) {
if (lo == hi) return;
int mid = lo + (hi - lo)/2;
mergeSort(nums, lo, mid);
mergeSort(nums, mid + 1, hi);
merge(nums, lo, mid, hi);
}
void merge(vector<int> &nums, int lo, int mid, int hi) {
tmp = nums;
int i = lo, j = mid + 1;
// 双指针合并数组
for (int p = lo; p <= hi; p++) {
if (i == mid + 1) {
// 左半边数组已完成合并
nums[p] = tmp[j++];
}
else if (j == hi + 1) {
// 右半边数组已完成合并
nums[p] = tmp[i++];
}
else if (tmp[i] <= tmp[j]) {
nums[p] = tmp[i++];
}
else {
nums[p] = tmp[j++];
}
}
}