mergeSort
2013-07-25 15:12
281 查看
归并排序是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,
每个子序列是有序的。然后再把有序子序列合并为整体有序序列。归并排序是一种稳定的排序算法。
若将两个有序表合并成一个有序表,称为2-路归并。
归并排序采用经典的分治策略,同时也是分析递归例程的经典实例。实现代码如下。
每个子序列是有序的。然后再把有序子序列合并为整体有序序列。归并排序是一种稳定的排序算法。
若将两个有序表合并成一个有序表,称为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; }
相关文章推荐
- mergesort归并排序
- mergesort
- 归并排序 MergeSort
- 归并排序 MergeSort
- 算法基础复习-MergeSort
- 深入jdk——追踪Collections.sort 引发的bug(1)mergeSort
- MergeSort归并排序
- 归并排序--MergeSort
- python版mergesort
- 归并排序 MergeSort
- 归并算法-MergeSort
- 深入jdk——追踪Collections.sort 引发的bug(1)mergeSort
- 归并排序--MergeSort
- mergeSort - 归并排序
- MergeSort
- Algorithms - Week 3-0 Mergesort
- Interview - mergesort
- 深入jdk——追踪Collections.sort 引发的bug(1)mergeSort
- MergeSort归并排序
- 归并排序 MergeSort