算法导论【基础知识伪代码】学习版

本文详细介绍了基础算法如插入排序、分治方法(如归并排序和快速排序的子数组查找),以及概率分析中的雇佣问题和随机算法,还有线性时间复杂度的排序技巧,如堆排序、计数排序、基数排序和桶排序。
摘要由CSDN通过智能技术生成

一,基础知识

算法基础 

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 )

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陇院第一Sweet Baby

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值