diff --git a/notes/算法 - 排序.md b/notes/算法 - 排序.md index da871a17..da0d046e 100644 --- a/notes/算法 - 排序.md +++ b/notes/算法 - 排序.md @@ -299,7 +299,7 @@ private int partition(T[] nums, int l, int h) { ### 3. 性能分析 -快速排序是原地排序,不需要辅助数组,但是递归调用需要辅助栈。 +快速排序是原地排序,不需要辅助数组,但是递归调用需要辅助栈:期望深度为 O(logN),最坏为 N;先递归较短的一侧、较长的一侧改为循环,可以保证深度不超过 logN。 快速排序最好的情况下是每次都正好将数组对半分,这样递归调用次数才是最少的。这种情况下比较次数为 CN=2CN/2+N,复杂度为 O(NlogN)。 @@ -387,7 +387,7 @@ public T select(T[] nums, int k) { 堆中某个节点的值总是大于等于或小于等于其子节点的值,并且堆是一棵完全二叉树。前者称为大顶堆,后者称为小顶堆,下文以大顶堆为例。 -堆可以用数组来表示,这是因为堆是完全二叉树,而完全二叉树很容易就存储在数组中。位置 k 的节点的父节点位置为 k/2,而它的两个子节点的位置分别为 2k 和 2k+1。这里不使用数组索引为 0 的位置,是为了更清晰地描述节点的位置关系。 +堆可以用数组来表示,这是因为堆是完全二叉树,而完全二叉树很容易就存储在数组中。位置 k 的节点的父节点位置为 k/2,而它的两个子节点的位置分别为 2k 和 2k+1。这里不使用数组索引为 0 的位置,是为了更清晰地描述节点的位置关系;从下标 0 开始存储时,子节点为 2k+1 和 2k+2,父节点为 (k-1)/2。