版权声明:本文为博主原创文章,欢迎转载,转载请注明原文地址、作者信息。 https://blog.csdn.net/hjimce/article/details/79354722
1、分解
将待排序数组A[1..n]分成两个各含n/2个元素的子序列,然后对这个两个子序列进行递归排序,最后将这两个已排序的子序列进行合并,即得到最终排好序的序列:
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)
}
}
2、合并
归并排序中一个很重要的部分是两个已排序序列合并的过程,这里需要另外开辟一块新的空间来作为存储这两个已排序序列的临时容器。假设对A[p..r]序列进行合并,已知A[p..q]及A[q+1..r]为已排序的序列,合并的具体步骤为:
Step 1:新建两个数组L、R分别存储待合并序列A[p..q]和A[q+1..r],将待排序序列中的对应元素copy到L和R中,L和R最后设置一个极大值作为“哨兵”;
Step 2:令指针i指向L的起始元素,j指向R的起始元素,k指向A待合并部分的起始元素A[p];
Step 3:若L[i]≤R[j],令A[k]=L[i],i=i+1,k=k+1;
否则,令A[k]=R[j],j=j+1,k=k+1;
(这一步即依次比较i、j所指向的元素,将较小值依次放入到A中相应位置。)
Step 4 :重复Step 3,r-p+1次后停止,即依次确定A[p..q]每个位置上的元素。
经过合并操作后,A[p..q]为一个有序序列