首页 > 代码库 > 归并排序
归并排序
#include <stdio.h>#include <stdlib.h>void Merge(int A[] , int TmpArray[] , int Lpos , int Rpos , int RightEnd);void MSort(int A[] , int TmpArray[] , int Left , int Right);void MergeSort(int A[] , int N);int main(int argc, const char * argv[]) { int A[15] = { 9,8,6,7,5,3,4,1,2,0,4,7,8,3,2}; MergeSort(A, 15); int B[12] = { 1 , 3, 4, 5, 9 ,2, 5,6,7,8,10,11} ; int *Tmp = malloc(sizeof(int) * 12); //Merge(B, Tmp, 0, 5, 11); MSort(B, Tmp, 0, 12); //Merge(B, Tmp, 0, 7, 12); for (int i = 0 ; i < 12 ; i++) printf("%d " , B[i]); return 0;}// merge 过程,其主要的作用是合并两个已经排序的数组// 由于这里是一个数组,我们要合并数组的前半部分和后半部分// Lpos 是前半部分是的开头,Rpos是后半部分的开头// RightEnd 是右半部分的结尾。// 同时,我们需要一个临时数组来存储TmpArray,事后将临时数组// 拷贝回来,void Merge(int A[] , int TmpArray[] , int Lpos , int Rpos, int RightEnd){ int i , LeftEnd , NumElements , TmpPos; LeftEnd = Rpos - 1 ; //数组的左半部分最后一个元素位置 TmpPos = Lpos; //临时数组的开始位置 NumElements = RightEnd - Lpos + 1 ; //元素的总个数 /* main loop */ while ( Lpos <= LeftEnd && Rpos <= RightEnd) if (A[Lpos] <= A[Rpos]) TmpArray[TmpPos ++] = A[Lpos ++]; else TmpArray[TmpPos ++] = A[Rpos ++]; while (Lpos <= LeftEnd) TmpArray[TmpPos ++] = A[Lpos ++]; while (Rpos <= RightEnd) TmpArray[TmpPos ++] = A[Rpos ++]; for ( i = 0 ; i < NumElements ; i++ , RightEnd --) A[RightEnd] = TmpArray[RightEnd]; // 注意这里,我当时写的是A[i] ,注意其 // 表达的意思,递归在某一段使用merge操作 }//Msort 的递归调用,其时间复杂度很好分析void MSort(int A[] , int TmpArray[] , int Left , int Right){ int Center ; if (Left < Right) { //注意这里我写的是Left < Center,调试了非常久才找出来! Center = (Left + Right) / 2 ; MSort(A, TmpArray, Left, Center); MSort(A, TmpArray, Center + 1, Right); Merge(A, TmpArray, Left, Center + 1 , Right); } }//递归调用的驱动程序void MergeSort(int A[] , int N){ int *TmpArray; TmpArray = malloc( N * sizeof(int)); if (TmpArray != NULL) { MSort(A, TmpArray, 0, N - 1 ); free(TmpArray); } else { printf("Out of space!!"); }}
归并排序
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。