以下我说的从根节点开始逐个进行下沉调整也是不遍历叶子结点的。
由于时间复杂度的概念问题,其实在比较两个对象的时间复杂度的时候会不清晰,比如 A 的时间复杂度是 O (n/2),B 的时间复杂度是 O (n)。在课本的概念上我们应该去掉系数,所以导致 A 和 B 的时间复杂度相同,但是你在实际应用的时候不傻的人都会选择 A 吧,毕竟 A 里面的 n 除了一个 2,时间复杂度会低一些。
所以我们为了算的比较清晰,所以接下来的算时间复杂度的过程会比较细致。
首先,从根结点开始逐个进行下沉调整,需要遍历数组中的每一个非叶子结点。如果说有 n 个结点,那么所有非叶子结点就有 n/2 个,所以时间复杂度为 O (n/2)。
接着,在进行下沉调整的过程中,每个结点最少不需要下沉,最多需要下沉到树的深度,树的深度为 logn。因此,每个结点下沉的时间复杂度为 O (logn/2)。
因此,从根结点开始逐个进行下沉调整总的时间复杂度为 O ((n/2)*(logn/2))。
接下来我们计算一下从最后一个非叶子结点开始逐个进行下沉调整的时间复杂度,同样的是所有非叶子结点的个数还是 n/2, 时间复杂度为 O (n/2)。
接着,在进行下沉调整的过程中,每个结点最少不需要下沉,最多需要下沉到树的深度,树的深度为 logn。
因此,每个结点下沉的时间复杂度也为 O ((n/2)*(logn/2))。
事实上,从最后一个非叶子结点开始逐个进行下沉调整和从根节点开始逐个进行下沉调整的时间复杂度化简后都是 O (nlogn)。因此,在时间复杂度方面,它们并没有本质上的区别。
上述是本人在看书的时候引发的一些思想和感悟,不一定正确,欢迎读者们讨论!大家一起学习一起进步