#include<stdio.h>
#include<malloc.h>
void Swap(int a[],int i,int j)
{
    int temp=a[i];
    a[i]=a[j];
    a[j]=temp;
}

//冒泡排序
void BubbleSorting(int a[],int len)
{
   for(int i=0;i<len;i++)
   {
       for(int j=i+1;j<len;j++)
       {
           if(a[i]>a[j])
           {
              Swap(a,i,j);
           }
       }
   }
}

//选择排序
void SelectSorting(int a[],int len)
{
     for(int i=0;i<len;i++)
     {
         int k=i;
         int temp=a[k];
         for(int j=i+1;j<len;j++)
         {
             if(a[j]<temp)
             {
                temp=a[j];
                k=j;
             }
         }
         Swap(a,i,k);
     }
}

//插入排序
void InsertSorting(int a[],int len)
{
    for(int i=1;i<len;i++)
    {
        int k=i;
        int temp=a[k];
        for(int j=i-1;(j>=0)&&(a[j]>temp);j--)
        {
            a[j+1]=a[j];
            k=j;
        }
        a[k]=temp;
    }
}

//希尔排序
void ShellSorting(int a[],int len)
{
     int gap=len;
     do
     {
        gap/=2;
        for(int i=gap;i<len;i++)
        {
           int k=i;
           int temp=a[k];
           for(int j=i-gap;(j>=0)&&(a[j]>temp);j-=gap)
           {
                a[j+gap]=a[j];
                k=j;
           }
           a[k]=temp;
        }
     }while(gap>0);
}

//快速排序
int Pos(int a[],int low,int high)
{
     int i=low;
     int j=high;
     int k=a[low];
     while(i<j)
     {
          while(a[j]>k) j--;
          Swap(a,i,j);
          while(a[i]<k) i++;
          Swap(a,i,j);
     }
     return i;
}

void QSorting(int a[],int low,int high)
{  
       if(low<high)
       {
         int pos=Pos(a,low,high);
         QSorting(a,low,pos);
         QSorting(a,pos+1,high);
       }
}

void QuickSorting(int a[], int len)
{
    QSorting(a, 0, len-1);
}

//归并排序
void MergerSorting(int a[],int des[],int low,int mid,int high)
{
     int i=low;
     int j=mid+1;
     int k=low;
     while((i<=mid)&&(j<=high))
     {
           if(a[i]<a[j]) des[k++]=a[i++];
           else des[k++]=a[j++];
     }
     while(i<=mid) des[k++]=a[i++];
     while(j<=high) des[k++]=a[j++];
}

void MSorting(int a[],int des[],int low,int high,int max)
{
    if(low==high)
    {
         des[low]=a[low];
    }
    else
    {
      int mid=(low+high)/2;
      int* space=(int*)malloc(sizeof(int)*max);
      if(space!=NULL)
      {
          MSorting(a,space,low,mid,max);
          MSorting(a,space,mid+1,high,max);
          MergerSorting(space,des,low,mid,high);
          free(space);
      }
    }
}

void MerSorting(int a[],int len)
{
    MSorting(a,a,0,len-1,len);
}

void ShowSorting(int a[], int len)
{
    for(int i=0;i<len;i++)
    {
        printf("%d ", a[i]);
    }
    printf("\n");
}

int main()
{
    int a[]={1,5,21,20,31,2,15,100};
    int len=sizeof(a)/sizeof(*a);
    //BubbleSorting(a,len);
    //SelectSorting(a,len);
    //InsertSorting(a,len);
    //ShellSorting(a,len);
    //QuickSorting(a,len);
    MerSorting(a,len);
    ShowSorting(a,len);
    return 0;
}