归并排序是O(N*LogN)时间复杂度,缺点是需要附加空间,对于内存的消耗是别的算法的两倍。
所以在内部排序并不是首选的算法,快速排序好像是更好的选择。但在外部排序中归并排序是不错的选择。
#include "stdafx.h"
#include "stdio.h"
void Merge(int A[], int tem[], int leftpos, int rightpos, int rightend)
{
int i, leftend, count, tempos;
leftend = rightpos - 1;
tempos = leftpos;
count = rightend - leftpos + 1;
//合并数据到附加空间
while( leftpos <= leftend && rightpos <= rightend )
{
if( A[leftpos] < A[rightpos] )
tem[tempos++] = A[leftpos++];
else
tem[tempos++] = A[rightpos++];
}
//拷贝剩余数据到附加空间
while( leftpos <= leftend )
tem[tempos++] = A[leftpos++];
while( rightpos <= rightend )
tem[tempos++] = A[rightpos++];
//将附加空间的数据拷贝回数列
for( i = 0; i < count; i++, rightend-- )
A[rightend] = tem[rightend];
}
void MSort(int A[], int tem[], int left, int right)
{
int center;
if( left < right )
{
center = (left + right) / 2;//二分数列
MSort(A, tem, left, center);//递归调用
MSort(A, tem, center+1, right);//递归调用
Merge(A, tem, left, center+1, right);//合并分治
}
}
void MergeSort(int A[], int count)
{
int *tem = NULL;
tem = (int*)malloc(count * sizeof(int)); //耗费附加空间
if( tem != NULL )
{
MSort(A, tem, 0, count-1);
free(tem);
}
}
int _tmain(int argc, _TCHAR* argv[])
{
int A[] = {23, 43, 76, 12, 8, 98, 76, 37};
int count = sizeof(A) / sizeof(A[0]);
MergeSort(A, count);
for( int i = 0; i < count; i++ )
printf("%d ", A[i]);
return 0;
}