1.归并排序算法的基本原理如下:
归并排序算法的基本思想是“分治法”,本文的程序实现采用递归。
伪码表示:
算法 MergeSort(A,p,r)
输入:数组A[p…r]
输出:升序排列的数组A
if p<r
then q<-(p+r)/2
MergeSort(A,p,q)//递归处理左部分元素
MergeSort(A,q+1,r)//递归处理右部分元素
Merge(A,p,q,r)//合并
2.程序实现
void Merge(int a[],int b[],int start,int mid,int end)
{
int i,j,k;
i=start;
j=mid+1;//避免重复比较a[mid]
k=0;
while(i<=mid&&j<=end)//a数组的左右两部分并没有完全合并到b数组中
{
//对数组a的左右两部分的元素进行比较,数值小的优先进入b数组中
if(a[i]<=a[j])
b[k++]=a[i++];
else
b[k++]=a[j++];
}
while(i<=mid)//表示数组a的左半部分元素还有剩余
b[k++]=a[i++];
while(j<=end)//表示数组a的右半部分元素还有剩余
b[k++]=a[j++];
for(int i=0;i<k;i++)//将排好序的元素移入数组a中
a[start+i]=b[i];
}
void MergeSort(int a[],int b[],int start,int end)
{
int mid;
if(start<end)
{
mid=start+(end-start)/2;
MergeSort(a,b,start,mid);//处理左半部分
MergeSort(a,b,mid+1,end);//处理右半部分
Merge(a,b,start,mid,end);//将排好序的两部分合并
}
}
3.时间复杂度分析:
算法的基本操作可以认为是比较。
考虑最差情况:
假设n=6,最后一次进行合并时,左半部分和右半部分均有3个元素。
不妨设为 1 4 7 和 0 3 9
1和0比较,0进入有序部分
1和3比较,1进入有序部分
4和3比较,3进入有序部分
4和9比较,4进入有序部分
7和9比较,7进入有序部分
最后9进入有序部分
6个元素进行合并时最差进行5此比较。
因此n个元素进行合并时,最差进行n-1次比较。
T(n)=2T(n/2)+n-1
T(1)=0
采用换元迭代或者主定理可得归并排序算法的时间复杂度为O(nlogn)。
4.稳定性:
归并排序算法是稳定的。