码迷,mamicode.com
首页 > 编程语言 > 详细

归并排序

时间:2014-12-08 17:01:46      阅读:170      评论:0      收藏:0      [点我收藏+]

标签:style   blog   io   ar   color   os   使用   sp   for   

#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!!");
    }
}

 

归并排序

标签:style   blog   io   ar   color   os   使用   sp   for   

原文地址:http://www.cnblogs.com/Big-Ding/p/4151204.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!