1、算法原理
归并排序(mergesort)以O(NlogN)最坏情形运行时间运行,而使用的比较次数几乎是最优的。它是递归算法一个很好的实例。
算法的基本操作就是合并两个已排序的表。因为两个表是已排序的,所以若将输出放到第三个表中时则该算法可以通过对输入数据一趟排序来完成。
2、代码
/*+++++++++++++++++++++++++++++++++++++
+ 归并排序(C版)
+
+author:zhouyongxyz 2013-4-15 9:16
+++++++++++++++++++++++++++++++++++++*/
#include <cstdio>
#include <cstdlib>
#define N 8
typedef int ElementType;
void Merge(ElementType a[],ElementType tmp[],int lpos,int rpos,int rightEnd); //将已知的两个已排序的数组进行合并。
void MSort(ElementType a[],ElementType tmp[],int left,int right); //递归调用实现数组的合并操作。
void MergeSort(ElementType a[],int n); //归并排序
int main()
{
int a[N]={4,3,5,2,9,7,6,8};
MergeSort(a,N);
for(int i=0;i<N;i++)
printf("%d ",a[i]);
printf("\n");
return 0;
}
void MergeSort(ElementType a[],int n)
{
ElementType *tmp=(ElementType*)malloc(n*sizeof(ElementType));
if(tmp!=NULL)
MSort(a,tmp,0,n-1);
}
void MSort(ElementType a[],ElementType tmp[],int left,int right)
{
if(left<right)
{
int center=(left+right)/2;
MSort(a,tmp,left,center);
MSort(a,tmp,center+1,right);
Merge(a,tmp,left,center+1,right);
}
}
void Merge(ElementType a[],ElementType tmp[],int lpos,int rpos,int rightEnd)
{
int tpos=0;
int leftEnd=rpos-1;
int numElements=rightEnd-lpos+1;
while(lpos<=leftEnd&&rpos<=rightEnd)
{
if(a[lpos]<=a[rpos])
tmp[tpos++]=a[lpos++];
else
tmp[tpos++]=a[rpos++];
}
while(lpos<=leftEnd)
tmp[tpos++]=a[lpos++];
while(rpos<=rightEnd)
tmp[tpos++]=a[rpos++];
for(int i=numElements-1;i>=0;i--,rightEnd--)
a[rightEnd]=tmp[i];
}