`` Merge Sort
`` Public Domain
`` available with other algorithms at: www.scriptol.net


// Merge: given a and b assumed to be sorted, returns a merged array

array merge(array a, array b)
    int n = a.size()
    int m = b.size()
    int top = n + m
    array result
    int i = 0, j = 0

    while top > 0  

        if i >= n
            result.push(b[j])
            j + 1
            continue
        /if    
        if j >= m
            result.push(a[i])
            i + 1
            continue
        /if    

        if a[i] < b[j]
            result.push(a[i])
            i + 1
        else
            result.push(b[j])
            j + 1
        /if
    
    let top - 1

return result


// Sort: returns a sorted copy of array a

array mergesort(array a)
    int n = a.size()
    if n < 2 return a

    int half = n / 2
    array first_half = mergesort(a[ .. half - 1])
    array second_half = mergesort(a[half .. ])
    
return merge(first_half, second_half)

array x = array( 3, 45, 5, 7, 65, 235, 9, 66, 30, 2)


x = mergesort(x)
x.display()