一,基础知识
算法基础
P10插入排序
INSERTION-SORT(A)//插入
for j=2 to A.length
key=A[j]
//Insert A[j] into the sorted sequence A[1..j-1].
i=j-1
while i>0 and A[i] > key
A[i+1]=A[i]
i=i-1
A[i+1]=key
P17分治法
Merge(A,p,q,r)
n1=q -p+1
n2=r -q
let L[1..n1+1] and R[1..n2+1] be new arrays
for i=1 to n1
L[i]=A[p+i-1]
for j=1 to n2
R[j]=A[q+j]
L[n1+1]= ∞
R[n2+1]= ∞
i=1
j=1
for k=p to r
if L[i]<= R[j]
A [k]=L [i]
i=i+1
else A [k]=R [j]
j=j+1
P19
MERGE-SORT(A,p,r)
if p<r
q= | (p+r)/2|
//| T|向下取整
MERGE-SORT(A,p,q)
MERGE-SORT(A,q+1,r)
MERGE(A,p,q,r)
P23 2-2冒泡排序
BUBBLESORT(A)
for i=1 to A.length -1
for j= A.length downto i+1
if A[j]<A[j-1]
exchange A[j] with A[j-1]
分治策略
P40
FIND -MAX-CROSSING-SUBARRAY(A,low,mid,high)
left -sum =-∞
sum =0
for i =mid downto low
sum =sum+A[i]
if sum >left-sum
left-sum=sum
max-left =i
right-sum = -∞
for j= mid + 1 to high
sum=sum+A[j]
if sum > right-sum
right-sum=sum
max-right=j
return (max-left,max-right,left-sum + right-sum)
P41
FIND -MAXIMUM-SUBARRAY(A,low,high)//分治法
if high == low
return (low,high,A[low])
//base case:only one element
else mid =| (low+high)/2|
(left-low,left-high,left-sum)=
FIND -MAXIMUM-SUBARRAY(A,low,mid)
(right-low,right-high,right-sum)=
FIND -MAXIMUM-SUBARRAY(A,mid+1,high)
(cross-low,cross-high,cross-sum)=
FIND -MAX-CROSSING-SUBARRAY(A,low,mid,high)
if left-sum >=righ-sum and left-sum >=cross-sum
return (left-low,left-high,left-sum)
elseif rightr-sum >=left-sum and right-sum>=cross-sum
return (right-low,right-high,right-sum)
else return (cross-low,cross-high,cross-sum)
p43矩阵乘法的STRASSEN算法
SQUARE-MATRIX-MULTIPLY (A,B) //矩阵乘法
n=A.rows
let C be a new n*n matrix
for i=1 to n
for j=1 to n
cij=0
for k=1 to n
cij =cij+aik*bkj
return C
P44递归分治算法
SQUARE-MATRIX-MULTIPLY-RECURSIVE (A,B) //直接的递归分治算法
n=A.rows
let C be a new n*n matrix
if n==1
c11=a11*b11
else partition A,B and C as in equations(4,9)
C11=SQUARE-MATRIX-MULTIPLY-RECURSIVE (A11,B11)
+SQUARE-MATRIX-MULTIPLY-RECURSIVE (A12,B21)
C12=SQUARE-MATRIX-MULTIPLY-RECURSIVE (A11,B12)
+SQUARE-MATRIX-MULTIPLY-RECURSIVE (A12,B22)
C21=SQUARE-MATRIX-MULTIPLY-RECURSIVE (A21,B11)
+SQUARE-MATRIX-MULTIPLY-RECURSIVE (A22,B21)
C22=SQUARE-MATRIX-MULTIPLY-RECURSIVE (A21,B12)
+SQUARE-MATRIX-MULTIPLY-RECURSIVE (A22,B22)
return C
概率分析与随机算法
P65雇佣问题
HIRE - ASSISTANT ( n )
best =0
// candidate 0 is a least - qualified dummy candidate
for i =1 to n
interview candidate i
if candidate i is better than candidate best
best = i
hire candidate i
P70
RANDOMIZED - HIRE - ASSISTANT ( n ) //随机算法
randomly permute the list of candidates
best= 0// candidate 0 is a least - qualified dummy candidate
for i =1 to n
interview candidate i
if candidate i is better than candidate best
best = i
hire candidate i
PERMUTE-BY-SORTING ( A )
n = A .length
let P [1.. n ]be a new array
for i =1 to n
P [i]= RANDOM (1,n^3)
sort A , using P as sort keys
P71
RANDOMIZE - IN - PLACE ( A )//随机产生恒等排列
n = A . length
for i =1 to n
swap A [ i ] with A [ RANDOM ( i , n )]
p72 5.3.2
PERMUTE-WITHOUT-IDENTITY ( A )
n = A.length
for i =1 to n -1
swap A [ i ] with A [ RANDOM ( i +1, n )]
p72 5.3.3
PERMUTE-WITH-ALL ( A )
n = A .length
for i =1 to n
swap A[i] with A[RANDOM(1,n)]
p73 5.3.4
PERMUTE-WITH-CYCLIC ( A )
n = A.length
let B[1..n] be a new array
off set= RANDOM (1,n)
for i =1 to n
dest = i+offset
if dest > n
dset= dest-n
B[dest]=A[i]
return B
P73 5.3.7
RANDOM-SAMPLE (m , n)
if m ==0
return Ø
else S = RANDOM-SAMPLE (m-1,n-1)
i = RANDOM (1, n )
if i∈ S
S = S ⋃ { n }
else S = S ⋃ { i }
return S
P78 在线雇佣问题
ON-LINEMAXIUM(k,n)
bestscore = -∞
for i =1 to k
if score (i)> bestscore
bestscore = score (i )
for i = k +1 to n
if score (i )> bestscore
return i
return n
二,排序和顺序统计量
堆排序
P86 维护最大堆性质
MAX-HEAPIFY ( A , i )//MAX-HEAPIFY的执行过程
l= LEFT ( i )
r = RIGHT ( i )
if l < A.heap-size and A[l]> A [i]
largest = l
else largest = i
if r <= A.heap-size and A [r]> A[largest ]
largest = r
if largest ≠ i
exchange A [i] with A [largest]
MAX - HEAPIFY (A , largest)
P87 建堆
BUILD-MAX-HEAP ( A )//建堆
A.heap-sixze = A.length
for i =[A.length /2] downto
MAX-HEAPIFY (A , i)
P89 堆排序算法
HEAPSORT ( A )//堆排序算法
BUILD-MAX-HEAP ( A )
for i = A.length downto 2
exchange A [1] with A [i]
A.heap-size = A.heap-size -1
MAX-HEAPIFY ( A ,1)
P90 优先队列
//过程 HEAP-EXTRACT-MAX 实现 EXTRACT-MAX 操作。
//它与 HEAPSORT 过程中的 for 循环体部分(第3~5行)很相似。
HEAP-EXTRACT-MAX (A)
if A.heap-size < 1
error "heap underflow"
max = A [1]
A [1]= A [A.heap-size]
A.heap-size = A.heap-size -1
MAX-HEAPIFY (A ,1)
return max
HEAP-INCREASE-KEY(A,i,key)
// HEAP-INCREASE-KEY
if key< A[i]
error " new key is smaller than current key "
A[i]= key
while i > 1 and A[PARENT (i)] < A [ i ]
exchange A [ i ] with A [PARENT ( i )]
i = PARENT (i)
P92
MAX-HEAP-INSERT (A, key)
A.heap-size = A.heapsize +1
A [A.heapsize]= -∞
HEAP-INCREASE-KEY (A,A.heap-size,key)
P93插入法建最大堆
BUILD-MAX-HEAP '( A )//插入法建最大堆
A.heap-size =1
for i =2 to A.length
MAX-HEAP-INSERT (A , A [i])
快速排序
P95 快排的描述
QUICKSORT ( A, p, r )//快排
if p < r
q = PARTITION (A, p, r)
QUICKSORT ( A, p, q-1)
QUICKSORT ( A , q +1, r )
数组的划分
PARTITION ( A , p , r )//数组划分
x = A [ r ]
i = p -1
for j = p to r -1
if A[j]≤ x
i = i +1
exchange A [i ] with A [j ]
exchange A [i +1] with A [r ]
return i +1
P100 快排的随机化版本
RANDOMIZED - PARTITION (A , p, r )
i = RANDOM ( p , r )
exchange A [ r ] with A [ i ]
return PARTITION ( A , p , r )
//新的快速排序不再调用 PARTITION ,而是调用 RANDOMIZED - PARTITION
RANDOMIZED - QUICKSORT ( A , p , r)
if P <r
q= RANDOMIZED - PARTITION ( A , p , r)
RANDOMIZED - QUICKSORT ( A , p , q -1)
RANDOMIZED - QUICKSORT ( A , q +1, r)
P103 HORE的划分的正确性
HOARE-PARTITION(A,p,r)//C.R.Hoare设计划分算法
x = A[p]
i = p -1
j= r +1
while TRUE
repeat
j = j -1
until A [j]≤ x
repeat
i = i +1
until A [j] ≥ x
if i < j
exchange A [i] with A [i]
else return j
P105 快排的栈深度
TAIL-RECURSIVE-QUICKSORT (A , p , r )
while p < r
// Partition and sort left subarray
q = PARTITION ( A , p , r )
TAIL-RECURSIVE-QUICKSORT (A, p, q-1)
p = q +1
线性时间排序
P109计数排序
//在计数排序算法的代码中,假设输入是一个数组 A [1.. n ], A . length = n 。
//我们还需要两个组: B [1.. n ]存放排序的输出, C [ O .. k ]提供临时存储空间。
COUNTING - SORT (A , B, k)
let C [0.. k ] be a new array
for i = 0 to k
C[ i ]=0
for j =1 to A.length
C [ A [j] ]= C [ A [j] ]+1
// C [ i ] now contains the number of elements equal to i .
for i =1 to k
C [i ]= C [i ]+ C [i -1]
// C [ i ] now contains the number of elements less than or equal to i .
for j = A.length downto 1
B [ C [ A [j] ] ]= A [ i ]
C [ A [j]]= C [ A [j] ] - 1
P111 基数排序
RADIX-SORT ( A , d )//基数排序
for i =1 to d
use a stable sort to sort array A on digit i
P112 桶排序
BUCKET - SORT (A ) //桶排序
n = A.length
let B [0.. n -1] be a new array
for i =0 to n -1
make B [ i ] an empty list
for i =1 to n
insert A[i] into list B list B[ ⅬnA[i] 」]
for i =0 to n -1
sort list B [i] with insertion sort
concatenate the lists B [0], B [1],…. B [n -1] together in order
P116排序引理和列排序
COMPARE-EXCHANGE(A,i,j) //排序引理和列排序
if A[i]>A[j]
exchange A[i] with A[j]
INSERTION-SORT(A)
for j=2 to A.length
for i=j-1 downto 1
COMPARE-EXCHANGE(A,i,i+1)
中位数和数据统计量
P119
MINIMUM ( A )//找最小值
min = A [1]
for i =2 to A.length
if min > A [ i ]
min = A [ i ]
return min
P120 期望为线性时间的选择算法
RANDOMIZED-SELECT ( A , p , r , i )
if p == r
return A [ p ]
k = q - p +1
q = RANDOMIZED-PARTITION ( A , p , r )
if i == k
//the pivot value is the answer
return A [ q ]
else if i < k
return RANDOMIZED-SELECT ( A , p , q-1, i )
else return RANDOMIZED-SELECT ( A , q +1, r , i -k )