对已有两段排好序的数组进行排序
依次比较两数组元素大小然后放入大数组中
既然如此,那我们先将左右子数组进行内部排序,其后对左右子数组整体进行排序
//归并:对于左右已经排好序的一列数组(需要先解决左右两截的排序问题)
void merge(int *a,int L,int M,int R){//合并
int left_size=M-L;
int right_size=R-M+1;
int left[left_size];//开一个左数组,存放左边一截排序好的数
int right[right_size];//开一个右数组,存放右边一截排序好的数
int i,j,k;
//开始写入左数组
for(i=L;i<M;i++){
left[i-L]=a[i];
}
//开始写入右数组
for(i=M;i<=R;i++){
right[i-M]=a[i];
}
//开始合并到原数组
i=0;j=0;k=L;
while(i<left_size&&j<right_size){
if(left[i]<right[j]){
a[k]=left[i];
i++;
k++;
}
else {
a[k]=right[j];
j++;
k++;
}
}
while(i<left_size){
a[k]=left[i];
i++;
k++;
}
while(j<right_size){
a[k]=right[j];
j++;
k++;
}
return;
}
在合并之前,我们需要解决两个分数组的排序:
即对左边进行合并,再对右边进行合并(递归)
void mergesort(int *a,int L,int R){//归并排序 (递归)
if(L==R){
return;
}
else {
int M=(L+R)/2;
mergesort(a,L,M);//排序左边
mergesort(a,M+1,R);//排序右边
merge(a,L,M+1,R); //合并排序
}
return;
}