mirror of
https://github.com/CyC2018/Interview-Notebook.git
synced 2026-11-01 03:23:42 +00:00
Update 算法 - 排序.md
补充快速排序递归深度与堆从下标 0 开始存储时的下标关系。
This commit is contained in:
+2
-2
@@ -299,7 +299,7 @@ private int partition(T[] nums, int l, int h) {
|
||||
|
||||
### 3. 性能分析
|
||||
|
||||
快速排序是原地排序,不需要辅助数组,但是递归调用需要辅助栈。
|
||||
快速排序是原地排序,不需要辅助数组,但是递归调用需要辅助栈:期望深度为 O(logN),最坏为 N;先递归较短的一侧、较长的一侧改为循环,可以保证深度不超过 logN。
|
||||
|
||||
快速排序最好的情况下是每次都正好将数组对半分,这样递归调用次数才是最少的。这种情况下比较次数为 C<sub>N</sub>=2C<sub>N/2</sub>+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。
|
||||
|
||||
<div align="center"> <img src="pics/heap-array.png" width="460px"/> </div><br>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user