归并排序的实现

归并排序

算法导论第二章就着重介绍的归并排序,充分体现了分治法的思想,同时也利用了递归。也是类比生活中洗牌的场景,十分生动形象。

具体代码:


void merge(int a[],int p ,int q,int r)
{
    int i=0,j=0,k;
    //左右新数组
    int *LeftArray;
    int *RightArray;
    //左右数组大小
    int size_left ,size_right;
    size_left = q-p+1;  
    size_right = r-q;
    //分配左右数组空间
    LeftArray = (int*)malloc(sizeof(int)*size_left);
    RightArray = (int*)malloc(sizeof(int)*size_right);
    //分别复制a数组左右两边
    for (i = 0;i < size_left ; i++)  
    {  
        LeftArray[i] = a[p+i];  
    }  
    for (j = 0;j < size_right ; j++)  
    {  
        RightArray[j] = a[q+j+1];  
    }  
    //memcpy(LeftArray,a,sizeof(size_left));
    //memcpy(RightArray,a+q,sizeof(size_right));
    i=0;j=0;
    for(k=p;k<=r;k++)
    {
        if(i<size_left && j<size_right)
        {
            if(LeftArray[i] <= RightArray[j])
            {
                a[k] = LeftArray[i];
                i++;
            }
            else if( j < size_right)
            {
                a[k] = RightArray[j];
                j++;
            }
        }
        else if(i < size_left)
        {
            a[k] = LeftArray[i];
            i++;
        } 
        else if( j < size_right)
        {
            a[k] = RightArray[j];
            j++;
        }
    }
    //回收申请的堆内存
    free(LeftArray);
    LeftArray = NULL;
    free(RightArray);
    RightArray = NULL;
}


void merge_sort(int a[],int p ,int r)
{
    int mid;
    if(p<r)
    {
        mid = (p+r)>>1;
        merge_sort(a,p,mid);
        merge_sort(a,mid+1,r);
        merge(a,p,mid,r);
    }
}

测试代码:
这里写图片描述

运行结果:
这里写图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值