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;}
- MergeSort
- mergesort
- MergeSort
- mergesort
- mergesort
- Mergesort
- mergesort
- mergeSort
- mergeSort
- mergesort
- MergeSort
- MergeSort
- MergeSort
- MergeSort
- Mergesort
- Mergesort
- mergeSort
- mergesort
- 给你一个字符串,找出该字符串中对称的子字符串的最大长度。
- 关于使用C++ json库一些错误的解决方法
- Linux--6:source命令及profile文件
- UVA 10025 - The ? 1 ? 2 ? ... ? n = k problem(数学)
- 数组中有一个数字出现的次数超过了数组长度的一半,找出这个数字
- mergeSort
- CreateFileMapping实现的共享内存及用法
- linux下查看目录的绝对路径
- LibJpeg编译
- input text 事件和方法
- 一个数据类型不匹配引发的coredump“血案”
- QXML之QXmlStreamWriter 读写
- ubuntu安装sunJDK
- 大唐电信面试试题