归并排序

来源:互联网 发布:手机有网络不能看视频 编辑:程序博客网 时间: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;}
原创粉丝点击