伪代码与真码的区别在于,在伪代码中,我们使用最清晰,最简洁的表示方式来说明给定的算法.伪代码与真码的另一个区别是伪代码通常不关心软件工程的问题.
插入排序INSERTION-SORT,参数是一个数组A[1..n],包含长度为n的要排序的一个序列.
该算法原址排序输入的数:算法在数组A中重排这些数,在任何时候,最多只有其中的常数个数字存储在数组外面.
INSERTION-SORT(A) 1 for j = 2 to A.length 2 key = A[j] 4 i = j-1 5 while i > 0 and A[i] > key 6 A[i+1] = A[i] 7 i = i-1 8 A[i+1] = key
如果一个算法的最坏情况运行时间具有比另一个算法更低的增长量级,那么我们通常认为前者比后者更有效.
分治模型在每层递归时都有三个步骤:
分解原问题为若干子问题,这些子问题是原问题的规模较小的实例.
解决这些子问题,递归地求解各子问题.然而,若子问题的规模足够小,则直接求解.
合并这些子问题的解成原问题的解.
归并排序算法完全遵循分治模式.
分解: 分解待排序的n个元素的序列成各具n/2个元素的两个子序列.
解决: 使用归并排序递归地排序两个子序列.
合并: 合并两个已排序的子序列以产生已排序的答案.
我们通过一个辅助过程MERGE(A, p, q, r)来完成合并,其中A是一个数组,p,q和r是数组下标,满足p≤q<r.
该过程假设子数组A[p..q]和A[q+1..r]都已排好序.它合并这两个子数组形成单一的已排好序的子数组并代替当前的子数组A[p..r].
在每个堆的底部放置一张哨兵牌.
MERGE(A, p, q, r) 1 n1= q - p + 1 2 n2= r - q
3 let L[1..n1+1] and R[1..n2+1] be new arrays 4 for i = 1 to n15 L[i] = A[p + i -1] 6 for j = 1 to n27 R[j] = A[q + j] 8 L[n1+ 1] = ∞ 9 L[n2+ 1] = ∞ 10 i = 1 11 j = 1 12 for k = p to r 13 if L[i] ≤ R[j] 14 A[k] = L[i] 15 i = i + 1 16 else A[k] = R[j] 17 j = j + 1
现在我们可以把过程MERGE作为归并排序算法的一个子程序来用.
MERGE-SORT(A, p, r)排序子数组A[p..r]中的元素.若p≥r,则该子数组最多有一个元素,所以已经排好序.
否则,分解步骤简单地计算一个下标q,将A[p..r]分成两个子数组A[p..q]和A[q+1..r],
前者包含⎾n/2⏋个元素,后者包含⎿n/2⏌个元素.
MERGE-SORT(A, p, r) 1 if p < r 2 q = (p+r)/2 3 MERGE-SORT(A, p, q) 4 MERGE-SORT(A, q+1, r) 5 MERGE(A, p, q, r)