思想:
归并排序是把两个或者两个以上的有序序列合并成一个新的有序序列。它的基本思想是:把数组A看做是n个有序的子序列组成,每个子序列长度为1。然后两两合并,得到n/2个长度为2的子序列;再继续两两合并。如此重复,直到得到一个长度为n的有序序列。
归并排序本质上是分治法。所谓分治法就是:把原问题分成n个规模较小而结构和原问题相似的子问题;递归地解决这些子问题,然后合并其结果就得到原问题的解。分治法在每一层递归上都有三个步骤:分解;解决;合并。
合并排序算法的步骤如下。1、分解:把n个元素分成各含n/2个元素的子序列;2、解决:用合并排序法对两个子序列递归地排序;3、合并:合并两个已排序的子序列已得到排序结果。
伪代码:
Merge-Sort(A, p, r)
If p<r
q = (p+r)/2 //分解
merge-Sort(A, p, q) //解决
merge-Sort(A, q+1, r) //解决
merge(A, p, q, r) //合并
merge(A,p,q,r)
for(i=p, j=q+1, k=p; i<=p && j<=r; k++)
if(A[i] < A[j])
tempA[k] = A[i++]
else
tempA[k] = A[j++]
if(i<=m) tempA[k,…,n] = A[i,..,q]
if(j<=n) tempA[k,…,n] = A[j,…,r]
A[p,..,r] = tempA[p,…,r]
算法分析:
分治法的时间复杂度,与其合并算法的时间复杂度有很大的关系。
Merge的时间复杂度是O(n)。
T(n)=2T(n/2)+O(n)=O(nlgn)
归并排序的时间复杂度与排列无关,无论是最好还是最坏情况都是O(nlgn)。
归并排序是一种稳定的排序。
1845

被折叠的 条评论
为什么被折叠?



