diff --git a/notes/算法.md b/notes/算法.md index 42954122..1419f3d3 100644 --- a/notes/算法.md +++ b/notes/算法.md @@ -312,13 +312,11 @@ public class Queue { # 三、union-find - **概览**
用于解决动态连通性问题,能动态连接两个点,并且判断两个点是否连通。

- **API**
| 方法 | 描述 | | ---: | :--- | @@ -327,8 +325,6 @@ public class Queue { | int find(int p) | 查找 p 所在的连通分量 | | boolean connected(int p, int q) | 判断 p 和 q 节点是否连通 | - **基本数据结构**
- ```java public class UF { private int[] id; @@ -354,7 +350,7 @@ public class UF { 但是 union 操作代价却很高,需要将其中一个连通分量中的所有节点 id 值都修改为另一个节点的 id 值。 -

+

```java public int find(int p) { @@ -377,7 +373,7 @@ public void union(int p, int q) { 但是 find 操作开销很大,因为同一个连通分量的节点 id 值不同,id 值只是用来指向另一个节点。因此需要一直向上查找操作,直到找到最上层的节点。 -

+

```java public int find(int p) { @@ -827,9 +823,9 @@ public Key delMax() { 交换之后需要进行下沉操作维持堆的有序状态。 -

+

-

+

```java public static void sort(Comparable[] a){ @@ -858,7 +854,15 @@ public static void sort(Comparable[] a){ ### 1. 排序算法的比较 -

+| 算法 | 稳定 | 原地排序 | 时间复杂度 | 空间复杂度 | 备注 | +| :---: | :---: | :---: | :---: | :---: | :---: | +| 选择排序 | no | yes | N2 | 1 | | +| 插入排序 | yes | yes | N \~ N2 | 1 | 时间复杂度和初始顺序有关 | +| 希尔排序 | no | yes | N 的若干倍乘于递增序列的长度 | 1 | | +| 快速排序 | no | yes | NlogN | logN | | +| 三向切分快速排序 | no | yes | N \~ NlogN | logN | 适用于有大量重复主键| +| 归并排序 | yes | no | NlogN | N | | +| 堆排序 | no | yes | NlogN | 1 | | | 快速排序是最快的通用排序算法,它的内循环的指令很少,而且它还能利用缓存,因为它总是顺序地访问数据。它的运行时间近似为 \~cNlogN,这里的 c 比其他线性对数级别的排序算法都要小。使用三向切分之后,实际应用中可能出现的某些分布的输入能够达到线性级别,而其它排序算法仍然需要线性对数时间。 diff --git a/pics/144cb0ae-48cf-486b-9e4c-6c6c2c559eeb.png b/pics/144cb0ae-48cf-486b-9e4c-6c6c2c559eeb.png new file mode 100644 index 00000000..38711991 Binary files /dev/null and b/pics/144cb0ae-48cf-486b-9e4c-6c6c2c559eeb.png differ diff --git a/pics/d78c77a1-ebc8-47f0-8d36-69a98bb4de20.png b/pics/d78c77a1-ebc8-47f0-8d36-69a98bb4de20.png new file mode 100644 index 00000000..0580323a Binary files /dev/null and b/pics/d78c77a1-ebc8-47f0-8d36-69a98bb4de20.png differ