归并排序有两种写法,有一种是基于递归的,有一种是基于迭代的,
基于迭代的是一种有倍增的思想在里面,
#include<iostream>
#include<vector>
using namespace std;
void merge_sort1(vector<int>& vec,int low,int high){
}
void merge_sort2(vector<int>&vec){
int n=vec.size();
vector<int> temp(n,0);
for(int i=1;i<n;i*=2){
for(int j=0;j+i<n;j+=2*i){
int end_j=j+i;
int end_k=min(j+2*i,n);
int iter_j=j;
int iter_k=end_j;
int iter=j;
while(iter_j<end_j&&iter_k<end_k){
if(vec[iter_j]<=vec[iter_k]){
temp[iter]=vec[iter_j];
iter_j++;
iter++;
}else{
temp[iter]=vec[iter_k];
iter_k++;
iter++;
}
}
while(iter_j<end_j){
temp[iter]=vec[iter_j];
iter++;
iter_j++;
}
while(iter_k<end_k){
temp[iter]=vec[iter_k];
iter++;
iter_k++;
}
for(int m=j;m<end_k;m++){
vec[m]=temp[m];
}
}
}
}
int main(){
int n;
cin>>n;
vector<int> vec(n,0);
for(int i=0;i<n;i++){
cin>>vec[i];
}
merge_sort2(vec);
for(int i=0;i<n;i++){
cout<<vec[i]<<" ";
}
cout<<endl;
return 0;
}
反正就是需要一个额外的数组,递归的版本很简单,就不写了。但是有一个需要注意的点,就是int end_k=min(j+2*i,n);需要注意,按照常规的方法是会越界的。