分治法,将一个序列分为两部分,分别排序,然后合并已排序序列。
1 MERGE_SORT(A,p,r) 2 mid = (p+r)/2 3 MERGE_SORT(A,p,mid) 4 MERGE_SORT(A,mid,r) 5 MERGE(A,p,mid,r) 6 7 MERGE(A,p,mid,r) 8 create array A‘[r-p+1] 9 i = p 10 j = mid 11 k = 0 12 13 while i<mid and j <= r 14 do 15 if A[i] <= A[j] then 16 A‘[k++] = A[i++] 17 else 18 A‘[k++] = A[j++] 19 20 while i < mid 21 do 22 A‘[k++] = A[i++] 23 24 while j <= r 25 do 26 A‘[k++] = A[j++] 27 28 copy array from A‘ to A
平均:O(nlgn)
最差:O(nlgn)
最优:O(nlgn)
空间复杂度:O(n)
归并排序由于有比较优的时间复杂度,并且具有排序稳定性(相同key值元素不改变位置),因此一般用在要求稳定性的大规模数据排序中。
stl的stable_sort内部采用了归并算法实现,在有足够归并空间时,其复杂度为O(nlgn),但当空间不足时,其复杂度为O(n lgn lgn )
原文地址:http://www.cnblogs.com/stormli/p/merge_sort.html