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);
}
}
