![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传](https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=https%3A%2F
return 语句开始之后,会执行之前剩余遗留下的语句和状态
#include<bits/stdc++.h>
using namespace std;void merge_sort(int l,int r){if(l == r) return ;int mid = l + r >> 1;cout << l << " " << mid << " ";cout << mid + 1 << " " << r << endl;merge_sort(l,mid);merge_sort(mid + 1,r);cout << "hello world!" << l << r << endl;// return 之后不是从头执行一遍程序// return 之后是执行上一次没有执行的状态语句
}int main(){int l = 1,r = 5;merge_sort(l,r);
}
我们的目的就是先排好1 2 然后排1 2 3 然后去排4 5 然后去排两个序列分别是1 2 3 和 4 5这两个序列,这种递归程序天然的帮我们实现了这个过程
下面给出完整代码:
#include <bits/stdc++.h>
using namespace std;
int n;
void merge_sort(vector<int>& a,int l,int r){if(l >= r){return ;}int mid = l + r >> 1;merge_sort(a,l,mid);merge_sort(a,mid + 1,r);int i = l,j = mid + 1;vector<int> temp;while(i <= mid && j <= r){if(a[i] <= a[j]) temp.push_back(a[i ++]);else temp.push_back(a[j ++]);}while(i <= mid) temp.push_back(a[i ++]);while(j <= r) temp.push_back(a[j ++]);for(int i = l,k = 0;i <= r;i ++){a[i] = temp[k ++];}
}
int main(){cin >> n;std::vector<int> v(n);for(auto &x: v) cin >> x;merge_sort(v,0,n - 1);for(auto x : v) cout << x << " ";return 0;
}