归并排序
来源:互联网 发布:手机有网络不能看视频 编辑:程序博客网 时间:2024/06/09 22:32
归并排序:用递归来写
直接上代码
#include <iostream>#include <vector>using namespace std;// 将[l,mid] [mid+1,r]两段合并并在arr数组上直接更改void merge(vector<int>& arr, int l, int mid, int r){ // 将[l,r]段的值用临时变量存储,长度是r-l+1 vector<int> temp(arr.begin()+l, arr.begin()+r+1); // 初始化,i指向左半部分的起始索引位置l;j指向右半部分起始索引位置mid+1 // k 指向arr,将结果写回arr int i = 0; mid = mid - l + i; int j = mid + 1; // k在原始数组上遍历 for(int k = l; k <= r; ++k){ if(i > mid){ // 如果左半部分元素已经全部处理完毕,直接等于右侧的即可 arr[k] = temp[j]; ++j; } else if(j >= r-l+1){ // 如果右半部分元素已经全部处理完毕,直接等于左侧的即可 arr[k] = temp[i]; ++i; } else if(temp[i] < temp[j]) { // 左半部分所指元素 < 右半部分所指元素 arr[k] = temp[i]; ++i; } else{ // 左半部分所指元素 >= 右半部分所指元素 arr[k] = temp[j]; ++j; } }}// 递归使用归并排序,对arr[l...r]的范围进行排序void mergeSort(vector<int>& arr, int l, int r){ if(l >= r) return; int mid = (l+r)/2; mergeSort(arr, l, mid); mergeSort(arr, mid+1, r); merge(arr, l, mid, r);}void mergeSort(vector<int>& arr){ mergeSort(arr, 0, arr.size()-1);}int main(){ vector<int> arr{4,3,2,1,5,6,8,7}; mergeSort(arr); for(auto c : arr) cout << c << endl; return 0;}
阅读全文
0 0
- 归并排序-归并排序
- 归并和归并排序
- 归并与归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 排序::归并
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 归并排序
- 【BigHereo 9】-----设计模式之动态代理
- Android 7.0文件权限变更(下载,拍照等)
- 使用junit进行多线程并发测试
- Android使用指南之sharedpreference
- RethinkDB联合创始人分享的44条工程管理经验
- 归并排序
- GPSR (Geographic and Energy-Aware Routing)路由协议
- SDUT 团战可以输、提莫必须死(BFS)
- 自定义View时,在主布局中引用却没有显示
- 深入理解Java虚拟机 第2章
- CODE[VS] 1006 等差数列
- Android Weak Handler:可以避免内存泄漏的Handler库
- Qcom wled 方式背光控制
- 中心化/标准化/scale()函数