归并排序
来源:互联网 发布:linux环境搭建 编辑:程序博客网 时间:2024/04/29 16:34
如果归并排序中待归并的两个相邻序列分别Wi是r[start]~r[mid]和r[mid+1]~r[end],需要将其归并成一个新序列r1[start]~r1[end]:
void merge(int r[], int r1[], int start, int mid, int end){ int i = start, j = mid + 1, k = start; while (i <= mid && j <= end) r1[k++] = (r[i] < r[j] ? r[i++] : r[j++]); memcpy(r1 + k, r + i, (mid - i + 1) * sizeof(int)); k += mid - i + 1; memcpy(r1 + k, r + j, (end - j + 1) * sizeof(int)); k += end - j + 1;}
一趟归并排序:
void MergePass(int r[], int r1[], int n, int h){ int i = 1; while (i < n - h * 2 + 1) { merge(r, r1, i , i + h - 1, i + h * 2 - 1); i += (h * 2); } if (i < n - h + 1) merge(r, r1, i, i + h - 1, n); else memcpy(r1 + i, r + i, (n - i + 1) * sizeof(int));}
归并排序主函数:
void MergeSort(int r[], int n){ int *r1 = new int [n + 1]; int h = 1; while (h < n) { MergePass(r, r1, n, h); h <<= 1; if (h >= n) { memcpy(r, r1, (n + 1) * sizeof(int)); break; } MergePass(r1, r, n, h); h <<= 1; } delete r1[];}
0 0
- 归并排序-归并排序
- 归并和归并排序
- 归并与归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 排序::归并
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- iOS NSPredicate谓词
- Centos下安装Tomcat教程
- IOB寄存器的使用:IOB= TRUE 属性
- http://www.jb51.net/article/41274.htm
- Properties使用方法解析
- 归并排序
- UVa #10163 Storage Keepers (习题9-9)
- Acitivity 之间界面切换动画
- ZOJ 3769 Diablo III
- Ajax jQuery Web聊天室
- 题目1521:二叉树的镜像
- 北向接口/ 南向接口
- 一个完整的Flexbox指南
- GCC和C99标准中的inline