《算法导论》笔记3-9

中位数和顺序统计

期望为线性时间的选择算法

这里的随机划分使用了快速排序中的随机版。

1
2
3
4
5
6
7
8
9
10
11
randomized_select(A, low, high, index)
if low == high
return A[low]
mid = randomized_partition(A, low, high)
leftRange = mid - low + 1
if index == leftRange
return A[mid]
elif index < leftRange
return randomized_select(A, low, mid - 1, index)
else
return randomized_select(A, mid + 1, high, index - leftRange)

《算法导论》笔记2-8

线性时间排序

计数排序

计数排序假设 n 个输入元素中的每一个都是在 0 到 max 区间内的一个整数。(max 是数组里最大的数字)

基本思想:对每个输入元素 x,确定小于 x 的元素个数。利用这一信息,就可以直接把 x 放到它的输出数组中的位置了。例如如果有 17 个元素小于 x,则 x 就应该在第 18 个输出位置上。当有几个元素相同时,这一方案就要稍作修改,因为不能把它们放在同一输出位置。

假设输入数组是 A[0 … n],那么我们还需要两个数组:B[0 … n] 输出数组,C[0 … max] 临时数组。

Read more

《算法导论》笔记2-7

快速排序

与归并排序一样,快速排序也使用了分治思想,下面是对一个典型的子数组 A[low … high] 进行快速排序的三步分支过程:

  1. 分解:数组 A[low … high] 被划分为两个子数组 A[low … mid - 1] 和 A[mid + 1 … high],使得 A[low … mid - 1] 中的每一个元素都小于等于 A[mid],而 A[mid] 也小于等于 A[mid + 1 … high] 中的每个元素。
  2. 解决:通过递归调用快速排序,对子数组 A[low … mid - 1] 和 A[mid + 1 … high] 进行排序。
  3. 合并:因为子数组都是原址排序的,所以不需要合并操作:数组 A[low … high] 已经有序。
Read more

《算法导论》笔记3-10

数据结构

栈(stack)

判断空栈:

1
2
stack_empty(S)
return S.top == 0

压栈:

1
2
3
push(S, x)
S.top++
S[S.top] = x

弹栈:

1
2
3
4
5
6
pop(S)
if stack_empty(S)
error "underflow"
else
S.top--
return S[S.top + 1]
Read more

《算法导论》笔记3-12

二叉搜索树

递归查找:

1
2
3
4
5
6
7
tree_search(root, k)
if root == null or k == root.key
return root
if k < root.key
return tree_search(root.left, k)
else
return tree_search(root.right, k)
Read more

《算法导论》笔记3-13

红黑树

旋转:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
left_rotate(T, root)
rChild = root.right
root.right = rChild.left
if rChild.left != T.null
rChild.left.parent = root
rChild.parent = root.parent
if root.parent == T.null
T.root = rChild
elif root == root.parent.left
root.parent.left = rChild
else
root.parent.right = rChild
rChild.left = root
root.parent = rChild

插入:

Read more

《算法导论》笔记2-6

排序和顺序统计量

堆排序

(二叉)堆是一个数组,它可以被看成一个近似的完全二叉树(除了最底层,该树是完全满的,而且是从左到右填充)。

表示堆的数组 A 包括两个属性:

  • A.length(通常)给出数组元素的个数。
  • A.heap_size 表示有多少个堆元素存储在该数组中。
    也就是说,虽然 A[A.length] 可能都存有数据,但只有 A[A.heap_size] 中存放的是堆的有效元素。(0 <= heap_size <= length)
Read more