2.3-2重写MERGE
2015-06-28 17:18
190 查看
MERGE 过程,使之不使用哨兵元素,而是在一旦数组 L 或 R 中的所有元素都
被复制回数组 A 后,就立即停止,再将另一个数组中余下的元素复制回数组 A 中
被复制回数组 A 后,就立即停止,再将另一个数组中余下的元素复制回数组 A 中
#include<cstdio> using namespace std; int MERGE(int *A, int p, int q, int r){ int n1 = q - p + 1; int n2 = r - q; int L[1000],R[1000]; //初始化数组L[]R[]为无穷大; for(int i = 0; i <= n1+1; i++) L[i] = 1 << 30; for(int i = 0; i <= n2+1; i++) R[i] = 1 << 30; //分别向数组L[]R[]赋值; for(int i = 1; i <= n1;i++) L[i] = A[p + i - 1]; for(int j = 1; j <= n2;j++) R[j] = A[q+j]; //重新定义i,j(之前在以上四个for循环中定义的i,j寿命只限于其所在的for循环中); int i = 1; int j = 1; //进行归并; for(int k = p; k <= r; k++){ if(L[i] <= R[j]){ A[k] = L[i]; i++; continue; } else { A[k] = R[j]; j++; continue; } if(i >= n1 && j < n2){ A[k] = R[j]; j++; continue; } if(i < n1 && j >= n2){ A[k] = L[i]; i++; continue; } } } int MERGE_SORT(int *A,int p,int r) { if(p < r) { int q = ((p+r)/2); //进行递归; MERGE_SORT(A,p,q); MERGE_SORT(A,q+1,r); MERGE(A,p,q,r); } } int main() { int A[1000]; int p,r,n; scanf("%d",&n); p = 1; r = n; printf("输入原数组:\n"); for(int i = 1;i <= n;i++) scanf("%d",&A[i]); MERGE_SORT(A,p,r); printf("归并后的结果为:\n"); for(int j = 1;j <= n;j++) printf("%d ",A[j]); return 0; }
相关文章推荐
- require.js 简洁入门
- 最小公共祖先 (Tarjan) POJ1470
- Arduino 入门程序示例之步进电机(2015-06-28)
- 合并两个排序的链表及简单链表的一些操作(添加节点、删除节点)
- 最小公共祖先 (Tarjan) POJ1470
- JAVA实现简单的冒泡排序与选择排序
- Lucene-全文索引
- ManualResetEvent实现生产者消费者模式
- CAPropertyAnimation 用法
- VC++中的WinMain()函数介绍
- 常用排序算法之插入排序法
- Android:操作图片Exif信息
- drupal 7 安装失败后的补救办法
- css3 简单动画
- 源码分析之spring-JdbcTemplate日志打印sql语句
- java 之 对象与垃圾回收
- POJ 2155 Matrix【 二维树状数组 】
- 比较两个字符串长度,不使用strcmp函数
- Open vSwitch简述
- 一步步教你使用Proguard混淆Java源代码