一、归并排序是稳定的排序方法
二、时间复杂度为n*log(n)
三、空间复杂度为n
四、代码均通过vs2008编译运行
/************************************************************************/
/* copyright@Fisher Wang */
/* function @MergeSort */
/* data @04/21/2013 */
/************************************************************************/
#include <iostream>
#include <Windows.h>
#include <ctime>
#define ARR_CAP 10
#define ElementType int
/************************************************************************/
/* Function:Merge() To merge two arrays in order */
/************************************************************************/
void Merge(ElementType A[],ElementType TmpArray[],int Lpos,int Rpos,int RightEnd)
{
int i ,LeftEnd,NumElements,TmpPos;
LeftEnd = Rpos-1;
TmpPos = Lpos;
NumElements = RightEnd-Lpos+1;
while (Lpos<=LeftEnd&&Rpos<=RightEnd)
{
if (A[Lpos]<=A[Rpos])
{
TmpArray[TmpPos++]=A[Lpos++];
}
else
{
TmpArray[TmpPos++]=A[Rpos++];
}
}
while (Lpos<=LeftEnd)
{
TmpArray[TmpPos++]=A[Lpos++];
}
while (Rpos<=RightEnd)
{
TmpArray[TmpPos++]=A[Rpos++];
}
for (i = 0;i<NumElements;++i,--RightEnd)
{
A[RightEnd]=TmpArray[RightEnd];
}
return ;
}
void Msort(ElementType A[],ElementType TmpArray[],int Left,int Right)
{
int Center;
if (Left<Right)
{
Center=(Left+Right)/2;
Msort(A ,TmpArray,Left,Center);
Msort(A,TmpArray,Center+1,Right);
Merge(A,TmpArray,Left,Center+1,Right);
}
return ;
}
/************************************************************************/
/* Function:MergeSort() To realize merge sort */
/************************************************************************/
void MergeSort(ElementType A[],int N)
{
ElementType *TemArray = NULL;
TemArray = (ElementType*)malloc( N*sizeof(ElementType) );
if (TemArray!=NULL)
{
Msort(A ,TemArray,0,N-1);
free(TemArray);
}
else
{
puts("fatal error:no space for TmpArray!");
}
return ;
}
/************************************************************************/
/* main function */
/************************************************************************/
int main ( void )
{
int arr[ARR_CAP]={0};
for (int i = 0;i<ARR_CAP;++i)//产生随机数组
{
arr[i]=(int)GetTickCount()%100;
Sleep(10);
}
std::cout<<"original arr:"<<std::endl;
for (int i = 0;i<ARR_CAP;++i)
{
printf("%d ",arr[i]);
}
printf("\n");
MergeSort(arr,ARR_CAP);
std::cout<<"after merge sort arr:"<<std::endl;
for (int i = 0;i<ARR_CAP;++i)
{
printf("%d ",arr[i]);
}
printf("\n");
system("pause");
return 0;
}