算法导论 2.3-2
2013-05-07 19:17
162 查看
题目
改写MERGE过程,使之不使用哨兵元素,而是一旦L或R中的所有元素都被复制回数组A后,就立即停止,再将另一数组中余下的元素复制回数组A中。分析
L中所有元素都复制回数组A时,i的值是n1+1,同理,R中的所有元素复制回数组A时,j的值为n2+1,所以在循环中加入这两个判断即可。伪代码
MERGE(A, p, q, r)1 n1 <- q-p+1
2 n2 <- r-q
3 for i <- 1 to n1
4 then L[i] = A[p+i-1]
5 for j <- 1 to n2
6 then R[j] = A[j+q]
7 i <- 1
8 j <- 1
9 for k <- p to r
10 do if i == n1+1
11 then A[k] <- R[j]
12 j <- j+1
13 else if j == n2+1
14 then A[k] <- L[i]
15 i <- i+1
16 else if L[i] <= R[i]
17 then A[k] <- L[i]
18 i = i+1
19 else A[k] <- R[j]
20 j <- j+1
Python代码实现
def merge(a, p, q, r): n1 = q-p+1 n2 = r-q L = [] R = [] for i in range(0, n1): L.append(a[p+i]) for j in range(0, n2): R.append(a[j+q+1]) i = 0 j = 0 for k in range(p, r+1): if i > n1-1: a[k] = R[j] j += 1 elif j > n2-1: a[k] = L[i] i += 1 elif L[i] <= R[j]: a[k] = L[i] i += 1 else: a[k] = R[j] j += 1
相关文章推荐
- 算法导论学习2.3-4 插入排序的递归版本
- 算法导论(Exercise 2.3-6)
- 二分法实现插入排序,时间复杂度O(nlgn),算法导论练习2.3,linux纯C实现
- 《算法导论》学习笔记之Chapter 2-2.1,2.2,2.3插入排序,选择排序,归并排序
- 算法导论习题2.3-7
- 算法导论Java实现-二分查找(习题2.3-5)
- 算法导论——2.3-2无哨兵情况下的归并排序
- 算法导论 2.3-6(更正)
- 算法导论习题2.3-4 插入排序递归算法2
- 使用Java完成《算法导论》习题2.3-2
- 算法导论学习2.3-5 二分查找的递归形式
- 算法导论(Exercise 2.3-7)
- 使用Java完成《算法导论》习题2.3-4
- 算法导论Java实现-二分插入排序(习题2.3-6)
- 使用Java完成《算法导论》习题2.3-5
- 算法导论之2.3-7练习题
- 算法导论CLRS 2.3 合并排序
- 《算法导论》[第2章] 算法入门-[2.3] 算法设计
- 算法导论Java实现-二分查找运用(习题2.3-7)
- 判断序列中是否存在两个元素之和为x,时间复杂度O(nlgn),算法导论练习2.3,linux纯C实现