#include<stdio.h>
#include<limits.h>
void Merge(int arr[],int p,int q,int r)
{
    int n1 = q - p  + 1;
    int n2 = r - q;
    int Left[n1+1];
    int Right[n2+1];
    for(int i=0; i<n1; i++)
    {
        Left[i] = arr[p+i];
    }
    for(int j=0; j<n2; j++)
    {
        Right[j] = arr[q + j +1];
    }
    Left[n1]=INT_MAX;//哨兵,设为一个大数
    Right[n2]=INT_MAX;
    
   
    for(int i=0,j=0,k=p; k<=r;k++)
    {
        if(Left[i] <= Right[j])
        {
            arr[k] = Left[i];
            i++;
        }else{
            arr[k]=Right[j];
            j++;
        }
    }
}

void MergeSort(int arr[],int p,int r)
{
    if(p<r)
    {
        int q = (p+r)/2;
        MergeSort(arr, p, q);
        MergeSort(arr, q+1, r);
        Merge(arr,p,q,r);
    }
}


int main()
{
    int len =0;
    printf("输入要排序的数组长: ");
    scanf("%d",&len);
        
    int arr[len];
    printf("请输入 %d 个数\n",len);
    for(int i=0; i<len; i++)
    {
        scanf("%d",&arr[i]);
    }
    
    MergeSort(arr, 0, len-1);
    
    for(int i=0; i<len; i++)
    {
        printf("%d\t",arr[i]);
    }
    printf("\n");
    return 0;
}