归并排序

来源:互联网 发布:c语言输出钻石图案 编辑:程序博客网 时间:2024/04/28 05:24

1、算法原理

归并排序(mergesort)以O(NlogN)最坏情形运行时间运行,而使用的比较次数几乎是最优的。它是递归算法一个很好的实例。

算法的基本操作就是合并两个已排序的表。因为两个表是已排序的,所以若将输出放到第三个表中时则该算法可以通过对输入数据一趟排序来完成。


2、代码

/*++++++++++++++++++++++++++++++++++++++归并排序(C版)++author:zhouyongxyz2013-4-15 9:16+++++++++++++++++++++++++++++++++++++*/#include <cstdio>#include <cstdlib>#define N 8typedef 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++];elsetmp[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];}