归并排序(c语言)

归并排序示例:


这里写图片描述

把数组平均分成两半,若两个区间有序后,则进行归并。使两个区间有序和快排同样的方法一样,递归到最后只有一个值或者没有时即有序。但在归并时需要开辟一段空间把合并的数据存起来,再放回原数组。


时间复杂度:

N*logN


算法如下:


void _MergeSort(DataType* a, DataType* tmp, int left, int right)
{
    //对数组进行划分
    if (left >= right)
        return;
    int mid = left + ((right - left) >> 1);
    _MergeSort(a, tmp, left, mid);
    _MergeSort(a, tmp, mid+1, right);
    //开始进行归并
    int begin1 = left, begin2 = mid + 1;
    int end1 = mid, end2 = right;
    int index = left;
    while (begin1 <= end1&&begin2 <= end2)
    {
        if (a[begin1] < a[begin2])
        {
            tmp[index++] = a[begin1++];
        }
        else
            tmp[index++] = a[begin2++];
    }
    while (begin1 <= end1)
    {
        tmp[index++] = a[begin1++];
    }
    while (begin2 <= end2)
    {
        tmp[index++] = a[begin2++];
    }
    //将tmp数组的内容赋值给a数组
    index = left;
    while (index <= right)
    {
        a[index] = tmp[index];
        index++;
    }
}
void MergeSort(DataType* a, size_t n)
{
    assert(a);
    DataType* tmp = (DataType*)malloc(sizeof(DataType)*n);
    _MergeSort(a,tmp,0,n-1);
    free(tmp);//将申请的空间释放
}
void TestMergeSort()//测试归并排序
{
    DataType a[] = { 2, 5, 6, 9, 8, 3, 1, 0, 7, 4 };
    MergeSort(a, sizeof(a) / sizeof(DataType));
    PrintfBuff(a, sizeof(a) / sizeof(DataType));
}
int main()
{
    TestMergeSort();    
    return 0;
}

运行结果:

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值