diff --git a/notes/算法.md b/notes/算法.md index 9eb35e98..ad4679ca 100644 --- a/notes/算法.md +++ b/notes/算法.md @@ -600,9 +600,9 @@ Java 系统库中的主要排序方法为 java.util.Arrays.sort(),对于原始 ### 5.3 基于切分的快速选择算法 -快速排序的 partition() 方法,会将数组的 a[lo] 至 a[hi] 重新排序并返回一个整数 j 使得 a[lo..j-1] 小于等于 a[j],且 a[j+1..hi] 大于等于 a[j]。那么如果 j=k,a[j] 就是第 k 个数。 +快速排序的 partition() 方法,会返回一个整数 j 使得 a[lo..j-1] 小于等于 a[j],且 a[j+1..hi] 大于等于 a[j],此时第 a[j] 就是数组的第 j 大元素。 -该算法是线性级别的,因为每次正好将数组二分,那么比较的总次数为 (N+N/2+N/4+..),直到找到第 k 个元素,这个和显然小于 2N。 +可以利用这个特性找出数组的第 k 个元素。 ```java public static Comparable select(Comparable[] a, int k) { @@ -617,6 +617,8 @@ public static Comparable select(Comparable[] a, int k) { } ``` +该算法是线性级别的,因为每次正好将数组二分,那么比较的总次数为 (N+N/2+N/4+..),直到找到第 k 个元素,这个和显然小于 2N。 + # 查找 本章使用三种经典的数据结构来实现高效的符号表:二叉查找树、红黑树和散列表。