算法导论 2.3-2
来源:互联网 发布:sql case语句用法 编辑:程序博客网 时间:2024/06/05 17:16
题目
改写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
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-2
- 算法导论 练习 2.3-2
- 算法导论 练习题 2.3-2
- 算法导论 CLRS 2.3-7 2-2
- 算法导论2.3.2--归并排序
- 算法导论自做2.3-2
- 算法导论 2.3-7
- 算法导论 2.3-3
- 算法导论 2.3-4
- 算法导论 2.3-5
- 算法导论 2.3-7
- 算法导论2.3-6
- 算法导论2.3.7
- 算法导论2.3.7
- 算法导论2.3-7
- 算法导论 2-2
- 算法导论学习2
- 算法导论 24-2
- maven冲突问题笔记
- Redis作者谈Redis应用场景
- REDIS跳表(skiplist)
- linux文件锁技术文档
- 键盘过滤之内核级Hook(二)
- 算法导论 2.3-2
- hdu1070(找最便宜的牛奶喝)
- Python导入模块的方法
- 诠释Linux下resolv.conf文件
- 卡哇伊狗狗的spfa模板
- php综合复习大全
- FRM-18108 FRM-10102错误解决
- 调试网站出现:输入字符串的格式不正确。
- hdu1285-确定比赛名次