归并排序
2015-12-13 20:48
387 查看
//合并两个有序数组
归并实现的两种方法
(1):递归(自顶向下)
(2):循环控制(自底向上):
void Merge(int a[], int left, int mid, int right) { assert(a); int* tmp = new int[right - left + 1](); int index = 0; int begin1 = left, end1 = mid; int begin2 = mid + 1, end2 = right; while (begin1 <= end1&&begin2 <= end2) { if (a[begin1] < a[begin2]) { tmp[index++] = a[begin1++]; } else { tmp[index++] = a[begin2++]; } } while (begin1 <= end1) { tmp[index++] = a[begin1++]; } while (begin2 <= end2) { tmp[index++] = a[begin2++]; } memcpy(a + left, tmp, sizeof(int)*(index)); delete[]tmp; }
归并实现的两种方法
(1):递归(自顶向下)
void MergeSort(int a[], int left, int right) { if (left < right) { int mid = left + (right - left) / 2; MergeSort(a, left, mid); MergeSort(a, mid + 1, right); Merge(a, left, mid, right); } }
(2):循环控制(自底向上):
void merge_sort(int a[], int size) { assert(a); for (int gap = 1; gap < size; gap *= 2)//gap为子数组中元素的个数 { int i = 0; for (; i + 2 * gap - 1 < size; i += 2 * gap) { Merge(a, i, i + gap - 1, i + 2 * gap - 1); } if (i + gap - 1 < size-1) { Merge(a, i, i + gap - 1, size - 1); } } }
相关文章推荐
- canvas画时钟
- 小波包变换的入门 - - -MATLAB
- javaServlet了解
- Expectation Propagation: Theory and Application
- VC++ 6.0 中使用 MSComm.ocx
- java构建并引用用户自定义库
- 第十三周实践项目~Kruskal算法的验证
- RadioButton的drawableTop资源大小调整
- F - Stealing Harry Potter's Precious hdu 4771
- 初见WCF
- poj 1745
- 理解inode
- uva 1630——Folding
- 2014年5个最流行前端框架对比
- 页面搜索
- 查找——B-树的基本操作
- 进程上下文和中断上下文
- 数据库表的连接(Left join , Right Join, Inner Join)用法详解
- android 中禁止评论星级RatingBar 选择或改变
- 接口