基础指南 之 归并排序

归并排序

  1. 两个有序数组的归并
    数组 a 和数组 b 都是非降序的数组,数组长度分别为 m 和 n ,将两个数组合并成一个升序数组 c ,程序如下所示:
void merge(int * a,int m,int * b,int n,int * c)
{
    int i,j,k;
    i=j=k=0;
    while(i<m && j<n)
    {
        if(a[i]<b[j])
        {
            c[k++]=a[i++];
        }
        else
        {
            c[k++]=b[j++]
        }
    }
    while(i<m)
    {
        c[k++]=a[i++];
    }
    while(j<n)
    {
        c[k++]=b[j++];
    }
}
  1. 将一个无序数组利用归并排序排列成一个升序数组,程序如下所示。首先递归调用 merge_sort 函数,直至将序列划分成两个单个元素组成的子序列,再调用 merge_array 将两个元素组成的子序列保持升序,再返回到上一层递归,调用 merge_array 将两组由两个元素构成的子序列排成四个元素的升序序列,依次递归,使得整个序列升序。
void merge_array(int * a,int first,int mid,int last,int * tem)
{
    int i=first,m=mid,j=mid+1,n=last;
    int k=first;
    while(i<m && j<n)
    {
        if(a[i]<a[j])
        {
            tem[k++]=a[i++];
        }
        else
        {
            tem[k++]=a[j++];
        }
    }
    while(i<m)
    {
        tem[k++]=a[i++];
    }
    while(j<n)
    {
        tem[k++]=a[j++];
    }
    for (int t = first; t <= last; t++)
    {
        a[t]=tem[t];
    }
    
}

void merge_sort(int * a,int first,int last,int * tem)
{
    if(first<last)
    {
        int mid=(last+first)/2;
        merge_sort(a,first,mid,tem);
        merge_sort(a,mid+1,last,tem);
        merge_array(a,first,mid,last,tem);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值