您的位置:首页 > 其它

mergeSort

2013-07-25 15:12 281 查看
归并排序是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,

每个子序列是有序的。然后再把有序子序列合并为整体有序序列。归并排序是一种稳定的排序算法。  

若将两个有序表合并成一个有序表,称为2-路归并。

归并排序采用经典的分治策略,同时也是分析递归例程的经典实例。实现代码如下。

/************************************************
*** heapSort.c
*** 归并排序的实现
*************************************************/
#include <stdio.h>
#include <stdlib.h>

void mergeSort( int A[], int n );
void MSort( int A[], int tmpArray[], int nLeft, int nRight );
void merge( int A[], int tmpArray[], int nLpos, int nRpos, int nRightEnd );

void mergeSort( int A[], int n )
{
int *tmpArray;

tmpArray = malloc( n * sizeof( int ) );
if ( NULL != tmpArray )
{
MSort( A, tmpArray, 0, n - 1 );
free( tmpArray );
}
else
{
printf("Out of memory!\n");
}
}

void MSort( int A[], int tmpArray[], int nLeft, int nRight )
{
int nCenter = ( nLeft + nRight ) / 2;

if ( nLeft < nRight )
{
MSort( A, tmpArray, nLeft, nCenter );	/** 使左边部分数组有序 **/
MSort( A, tmpArray, nCenter + 1, nRight );	/** 使右边边部分数组有序 **/
merge( A, tmpArray, nLeft, nCenter + 1, nRight );	/** 合并两个有序数组,实现归并排序效果 **/
}
}

void merge( int A[], int tmpArray[], int nLpos, int nRpos, int nRightEnd )
{
int    nLeftEnd = 0;
int     nTmpPos = 0;
int		      i = 0;
int	nNumElement = 0;

nLeftEnd = nRpos - 1;
nTmpPos  = nLpos;
nNumElement = nRightEnd - nLpos + 1;

while ( nLpos <= nLeftEnd && nRpos <= nRightEnd )	/** 合并两个有序数组 **/
{
/**
*** 选取两个有序数组较小数存到临时数组
**/
if ( A[nLpos] < A[nRpos] )
{
tmpArray[nTmpPos++] = A[nLpos++];
}
else
{
tmpArray[nTmpPos++] = A[nRpos++];
}
}

/**
*** 复制两个有序数组中未选取到的一组数的一部分
**/
while ( nLpos <= nLeftEnd )
{
tmpArray[nTmpPos++] = A[nLpos++];
}
while ( nRpos <= nRightEnd )
{
tmpArray[nTmpPos++] = A[nRpos++];
}

/**
*** 将临时数组逆序复制到原数组
**/
for (i=0; i<nNumElement; i++, nRightEnd--)
{
A[nRightEnd] = tmpArray[nRightEnd];
}
}

int main()
{
int i = 0;
int n = 13;
int nArray[13] = {81, 94, 11, 96, 12, 35, 17, 95, 28, 58, 41, 75, 15};

printf("The arrry before mergeSort is: \n");
for (i=0; i<n; i++)
{
printf("%d ", nArray[i]);
}
printf("\n\n");

mergeSort( nArray, n );	/** 调用归并排序 **/

printf("The arrry after mergeSort is: \n");
for (i=0; i<n; i++)
{
printf("%d ", nArray[i]);
}
printf("\n");

return	0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  归并排序 分治 递归