RosettaCodeData/Task/Sorting-algorithms-Merge-sort/00-TASK.txt

66 lines
2.4 KiB
Plaintext

{{Sorting Algorithm}}
[[Category:Sorting]]
[[Category:Recursion]]
The &nbsp; '''merge sort''' &nbsp; is a recursive sort of order &nbsp; <big> n*log(n). </big>
It is notable for having a worst case and average complexity of &nbsp; <big> ''O(n*log(n))'', </big> &nbsp; and a best case complexity of &nbsp; <big> ''O(n)'' &nbsp; </big> (for pre-sorted input).
The basic idea is to split the collection into smaller groups by halving it until the groups only have one element or no elements &nbsp; (which are both entirely sorted groups).
Then merge the groups back together so that their elements are in order.
This is how the algorithm gets its &nbsp; ''divide and conquer'' &nbsp; description.
;Task:
Write a function to sort a collection of integers using the merge sort.
The merge sort algorithm comes in two parts:
a sort function and
a merge function
The functions in pseudocode look like this:
'''function''' ''mergesort''(m)
'''var''' list left, right, result
'''if''' length(m) ≤ 1
'''return''' m
'''else'''
'''var''' middle = length(m) / 2
'''for each''' x '''in''' m '''up to''' middle - 1
'''add''' x '''to''' left
'''for each''' x '''in''' m '''at and after''' middle
'''add''' x '''to''' right
left = mergesort(left)
right = mergesort(right)
'''if''' last(left) ≤ first(right)
'''append''' right '''to''' left
'''return''' left
result = merge(left, right)
'''return''' result
'''function''' ''merge''(left,right)
'''var''' list result
'''while''' length(left) > 0 and length(right) > 0
'''if''' first(left) ≤ first(right)
'''append''' first(left) '''to''' result
left = rest(left)
'''else'''
'''append''' first(right) '''to''' result
right = rest(right)
'''if''' length(left) > 0
'''append''' rest(left) '''to''' result
'''if''' length(right) > 0
'''append''' rest(right) '''to''' result
'''return''' result
;See also:
* &nbsp; the Wikipedia entry: &nbsp; [[wp:Merge_sort| merge sort]]
Note: &nbsp; better performance can be expected if, rather than recursing until &nbsp; <big> length(m) ≤ 1, </big> &nbsp; an insertion sort is used for &nbsp; <big> length(m) </big> &nbsp; smaller than some threshold larger than &nbsp; '''1'''. &nbsp; However, this complicates the example code, so it is not shown here.
<br><br>