Time complexity:
Worst-case: \(O(nlog(n))\)
Best-case: \(O(nlog(n))\)
Average-case: \(O(nlog(n))\)
Merge sort divides the array in half, sorts each of those halves, and them merges them back together.
void MergeSort(int *list, int size)
{
    partitionStep(list,size, 0, size-1);
}
void mergeStep(int *list, int size, int low, int middle, int high)
{
    int i;
    int *tmpList = (int *)malloc(sizeof(int)*size);
    for(i=0;i<size;i++)
        tmpList[i] = list[i];
    int tmpLeft = low;
    int tmpRight = middle + 1;
    int current = low;
    while( (tmpLeft <= middle) && (tmpRight <= high) )
    {
        if(tmpList[tmpLeft] <= tmpList[tmpRight])
            list[current++] = tmpList[tmpLeft++];
        else
            list[current++] = tmpList[tmpRight++];
    }
    
    int remaining = middle - tmpLeft;
    for (i=0; i<=remaining; i++)
    {
        list[current+i] = tmpList[tmpLeft+i];
    }
}
void partitionStep(int *list, int size, int low, int high)
{
    if(low < high)
    {
        int i;
        int middle = (low + high)/2;
        partitionStep(list, size, low, middle);
        partitionStep(list, size, middle+1, high);
        mergeStep(list, size, low, middle, high);
    }
}
 
								