The cost of merge sort
implemented classically either as a top-down recursive function or a bottom-up
iterative with a small local array of pointers is the same: O(N.log(N)). The number of comparisons will vary depending
on the actual contents of the array, but by at most a factor of 2.
You can improve this
algorithm at a linear cost by adding an initial comparison between the last
element of the left slice and the first element of the right slice in the merge
phase. If the comparison yields <= then you can
skip the merge phase for this pair of slices.
With this
modification, a fully sorted array will sort much faster, with a linear
complexity, making it the best case, and a partially sorted array will behave
better as well.