归并排序
来源:互联网 发布:域名注册购买 编辑:程序博客网 时间:2024/06/04 18:35
归并排序分为三块
1. 对外接口;
2. 迭代方法;
3. 将分别排好序的两段merge。
// 1. 对外接口void MergeSort(int arr[], int len) { if (arr != NULL && len > 0) { int *buf = new int[len]; // 只使用一个buf MergeSortDC(arr, 0, len - 1, buf); delete[] buf; }}// 2. 迭代void MergeSortDC(int arr[], int l, int h, int buf[]) { if (l < h) { int mid = l + (h - l) / 2; MergeSortDC(arr, l, mid, buf); MergeSortDC(arr, mid + 1, h, buf); Merge(arr, l, mid, h, buf); }}// 3. 合并void Merge(int arr[], int l, int mid, int h, int buf[]) { for (int i = l; i <= h; ++i) // 先将待merge部分copy到buf中 buf[i] = arr[i]; int bufLeft = l, bufRight = mid + 1; // 分别定位前后两段的最小值 int cur = l; while (bufLeft <= mid && bufRight <= h) { if (buf[bufLeft] <= buf[bufRight]) { arr[cur++] = buf[bufLeft++]; } else { arr[cur++] = buf[bufRight++]; } } // 此时有两种情况: // 1. 左半段余若干最大值 int remaining = mid - bufLeft + 1; // 左端还剩下多少没copy到arr // +1是因为bufLeft指向的是第一个未copy到arr的值! for (int i = 0; i < remaining; ++i) { arr[cur + i] = buf[bufLeft + i]; } // 2. 右半段余若干最大值 // arr中已有,不需再从buf复制过来}
尤其要注意:
合并步骤,最后将左半段剩余最大的数值copy到arr时,remaining的值!
阅读全文
0 0
- 归并排序-归并排序
- 归并和归并排序
- 归并与归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 排序::归并
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- PAT a1104题解
- 类实现数组去重及排序
- 【bzoj1131】 [POI2008]Sta
- 使用Java方法实现多线程下载案例
- uva 10340 All in All
- 归并排序
- web 学习笔记16-JDBC连接池 扩展已知类
- PAT a1106题解
- Linux-grep
- POJO、JavaBean、EJB的区别
- 畅通工程 HDU
- PoEdu_Python_Lesson008_复习_零散知识点
- PAT a1107题解
- redis初理解