归并排序

一、归并排序是稳定的排序方法

二、时间复杂度为n*log(n)

三、空间复杂度为n

四、代码均通过vs2008编译运行

 
/************************************************************************/
/* copyright@Fisher Wang                                                */
/* function @MergeSort                                                  */
/* data     @04/21/2013                                                 */
/************************************************************************/
#include <iostream>
#include <Windows.h>
#include <ctime>
#define ARR_CAP 10
#define ElementType int

/************************************************************************/
/*  Function:Merge()           To merge two arrays in order             */
/************************************************************************/
void Merge(ElementType A[],ElementType TmpArray[],int Lpos,int Rpos,int RightEnd)
{
    int i ,LeftEnd,NumElements,TmpPos;
    LeftEnd = Rpos-1;
    TmpPos = Lpos;
    NumElements = RightEnd-Lpos+1;

    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];
    }
    return ;
}
void Msort(ElementType A[],ElementType TmpArray[],int Left,int Right)
{
    int Center;
    if (Left<Right)
    {
        Center=(Left+Right)/2;
        Msort(A ,TmpArray,Left,Center);
        Msort(A,TmpArray,Center+1,Right);
        Merge(A,TmpArray,Left,Center+1,Right);
    }
    return ;
}

/************************************************************************/
/*  Function:MergeSort()           To realize merge sort                */
/************************************************************************/
void MergeSort(ElementType A[],int N)
{
    ElementType *TemArray = NULL;
    TemArray = (ElementType*)malloc( N*sizeof(ElementType) );
    if (TemArray!=NULL)
    {
        Msort(A ,TemArray,0,N-1);
        free(TemArray);
    }
    else 
    {
        puts("fatal error:no space for TmpArray!");
    }
    return ;
}

/************************************************************************/
/*                           main function                              */
/************************************************************************/
int main ( void )
{
    int arr[ARR_CAP]={0};
    for (int i = 0;i<ARR_CAP;++i)//产生随机数组
    {
        arr[i]=(int)GetTickCount()%100;
        Sleep(10);
    }

    std::cout<<"original arr:"<<std::endl;
    for (int i = 0;i<ARR_CAP;++i)
    {
        printf("%d ",arr[i]);
    }
    printf("\n");
    MergeSort(arr,ARR_CAP);
    std::cout<<"after  merge sort arr:"<<std::endl;
    for (int i = 0;i<ARR_CAP;++i)
    {
        printf("%d ",arr[i]);
    }
    printf("\n");

    system("pause");
    return 0;
}






 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值