没有题面
//归并的基本思路:
/*
...
*/
#include<iostream>
#include<cstdio>
using namespace std;
int n;
int a[1005];
int b[1005];
//int mid;
void merge(int l,int r);
int main()
{
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
merge(1,n);
for(int i=1;i<=n;i++){
cout<<a[i]<<" ";
}
}
void merge(int l,int r)
{
if(l==r)return;
int mid=(l+r)/2;
// ERR:写成全局变量
merge(l,mid);
merge(mid+1,r);
for(int i=l;i<=r;i++)
b[i]=a[i];
int i=l,j=mid+1;//
for(int k=l;k<=r;k++){
//ERR:。。
if(j>r){
a[k]=b[i];
i++;
}
else if(i>mid){
a[k]=b[j];
j++;
}
else if(b[i]<b[j]){//b[2]
a[k]=b[i];
i++;
}
else{
a[k]=b[j];
j++;
}
}
// cout<<l<<"-"<<r<<endl;
// for(int i=l;i<=r;i++)
// cout<<a[i]<<",";
// cout<<endl;
// cout<<endl;
}
如代码
归并的基本思路和二分有点像,把一个数组不断地从中间分开(mid),直到分不下去(判定条件是左端点等于右端点,而非mid=1啥的),然后排序。排序要通过用一个数组记录来实现,这是又一个难点,我原先额外定义了c数组来记录,结果发现合并时原数组分别被a数组与c数组储存,于是用b数组来判断,a数组来储存。然后说两个易错点, 一个是mid的定义,一定要用局部变量而非全局变量。另一个是i,j的赋值,把赋值语句写到了循环里,于是i,j就没有变过233.。。