a merge sort