第二章 合并排序-分治算法

/*
 * p,q,r是下标,满足p<=q<r,假设子糨能a[p..q]与a[q+1..r]已经排好序
 * 将两个合并排好序代替当前子数组A[p..r]
 * Running time: O(n) n = r-q+1 ÊÇÁœŽýºÏ²¢×ÓÊý×éÔªËصĞöÊýºÍ
 */
void merge(int a[], int p, int q, int r)
{
    int *left, *right;
    int n1, n2, i, j, k;
 
    n1 = q - p + 1;
    n2 = r - q;
 
    left = (int *)malloc(sizeof(int) * (n1+1));
    if (left == NULL)
        return ;
    right = (int *)malloc(sizeof(int) * (n2+1));
    if (right == NULL) {
        free(left);
        return ;
    }
 
    for (i = p, n1 = 0; i <= q; ++i, ++n1)
        left[n1] = a[i];
    for (i = q+1, n2 = 0; i <= r; ++i, ++n2)
        right[n2] = a[i];
 
    left[n1] = MAXVAL;
    right[n2] = MAXVAL;
 
    i = j = 0;
    for (k = p; k <= r; ++k) {
        if (left[i] < right[j])
            a[k] = left[i++];
        else
            a[k] = right[j++];
    }
 
    free(left);
    free(right);
}
 
/* 递归调用
 * O(nlgn)
 */
void merge_sort(int a[], int p, int r)
{
    int q;
    if (p < r) {
        q = (p + r) / 2;
        merge_sort(a, p, q);
        merge_sort(a, q+1, r);
        merge(a, p, q, r);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值