Mergesort

Pseudo code for the Mergesort algorithm:

MERGE-SORT(A, left, right)
    if(left < right)
        mid = floor((left+right)/2)
        MERGE-SORT(A, left, mid)
        MERGE-SORT(A, mid+1, right)
        MERGE(A, left, mid, right)


MERGE(A, left, mid, right)
    numLeft = mid - left + 1;
    numRight = right - (mid + 1) + 1 = right - mid;

    L[0...numLeft]
    R[0...numRight]

    // Copy over left elements
    for(i = left; i <= mid; i++)
         L[i-left] = A[i];

    // Copy over right elements
    for(i = mid+1; i <= right; i++)
        R[i-mid+1] = A[i];

    L[numLeft] = infinity;
    R[numRight] = infinity;

    i = 0; // index into L
    j = 0; // index into R
    for(k = left; k <= right; k++){
        if(L[i] <= R[j]){
            A[k] = L[i];
            i++;
        }
        else{
            A[k] = R[j]
            j++;
        }
    }