#include <stdio.h>
void merge(int arr[],int L,int M,int R)
{
int i,j=0,k=L;
int left[M-L];//新左子表
int right[R-M+1];//新右子表
for(i=L;i<M;i++)
{//复制
left[i-L]=arr[i];
}
for(i=M;i<=R;i++)
{//复制
right[i-M]=arr[i];
}
i=0;j=0;k=L;
while(i<M-L&&j<R-M+1)
{//两个子表均未比较完
if(left[i]<right[j])
{//右子表的值大于左,左子表覆盖原表第一个元素;右子表加一
arr[k]=left[i];
i++;
k++;
}
else
{
arr[k]=right[j];
j++;
k++;
}
}
//若一个子表比较完成,将另一个子表剩余的元素顺序覆盖到原表
while(i<M-L)
{
arr[k]=left[i];
i++;
k++;
}
while(j<R-M+1)
{
arr[k]=right[j];
j++;
k++;
}
}
//void merge2(int A[], int low ,int mid, int high){
// int B[10];
// for(int k=low;k<=high;k++){
// B[k]=A[k];
// }
//
// int i=low;
// int j=mid+1;
// for(int k=i;i<=mid&&k<=high;k++){
// if(B[i]<=B[j]){
// A[k]=B[i++];
// }else{
// A[k]=B[j++];
// }
// while(i<=mid){
// A[k++]=B[i++];
// }
// while(j<=high){
// A[k++]=B[j++];
// }
// }
//}
void mergesort(int arr[],int L,int R)
{
int M=(L+R)/2;
if(L==R)
{
return;
}
else
{
mergesort(arr,L,M);
//在左子表归并排序
mergesort(arr,M+1,R);
//在右子表归并排序
merge(arr,L,M+1,R);
//将已排好序的左右字表合并
}
}
int main()
{
int arr[10]={5,8,10,6,9,7,19,23,46,1};
int L=0,R=9,i;
mergesort(arr,L,R);
printf("归并排序结果为:");
for(i=0;i<10;i++)
{
printf("%d ",arr[i]);
}
return 0;
}