From ceda72b1eceeaf7dcd1a4047186fd4ee71b3d188 Mon Sep 17 00:00:00 2001 From: CyC2018 Date: Sat, 31 Oct 2026 00:23:19 +0800 Subject: [PATCH] =?UTF-8?q?Update=20=E7=AE=97=E6=B3=95=20-=20=E6=8E=92?= =?UTF-8?q?=E5=BA=8F.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 补充快速排序递归深度与堆从下标 0 开始存储时的下标关系。 --- notes/算法 - 排序.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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。