mergeSort

来源:互联网 发布:电子科技大学网络教育 编辑:程序博客网 时间:2024/05/21 17:55

归并排序是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,

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

若将两个有序表合并成一个有序表,称为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;intnNumElement = 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");return0;}


原创粉丝点击